題目大意:有$n(n\leqslant3500)$個人坐成乙個環,$0$號手上有個球,每秒鐘可以向左或向右傳球,問$m$秒後球在$0$號手上的方案數。
題解:乙個$o(nm)$的$dp$,$f_=f_+f_$($f_$表示現在為第$i$秒,球在$j$號手上的方案數)。這樣明顯不可以通過。
生成函式,$x^i$對應為原環上第$|i|\bmod n$個人,於是發現$f_=\sum\limits_[x^](x^+x)^m$,所以答案為$\sum\limits_[x^](x^+x)^m$。這樣感覺不可做,但是把它變成迴圈卷積後,答案就是$[x^0](x^+x)^m$,複雜度$o(n\log_2n\log_2m)$。
注意,模數為$10^9+7$,需要三模$ntt$
卡點:無
c++ code:
#include #include #define maxn 3510const int mod = 1e9 + 7;
namespace math
inline int inv(int x, const int mod)
}int n, m;
namespace poly
template struct p
inline void init(int n)
inline void ntt(int *a, const int op = 1) }}
if (!op)
} int res[n];
inline int operator (const int i)
int c[n], d[n];
void mul(int *a, int *b)
void sqr(int *a)
} ;const int mod1 = 469762049, mod2 = 998244353, mod3 = 1004535809;
const long long mod_1_2 = static_cast(mod1) * mod2;
const int inv_1 = math::inv(mod1, mod2), inv_2 = math::inv(mod_1_2 % mod3, mod3);
pp1;
pp2;
pp3;
inline int get(const int a, const int b, const int c)
inline void reduce(int &x)
inline void init(int n)
void mul(int *a, int *b)
void sqr(int *a)
inline void pw(int *res, int *base, int p)
}#undef n
}int f[8192], g[8192];
int main()
洛谷 P1057 傳球遊戲
題目描述 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出...
洛谷 P1057 傳球遊戲
題目描述 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出...
P1057 傳球遊戲 洛谷
上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出去的那個同...