洛谷P5173 傳球

2022-05-23 22:00:15 字數 1487 閱讀 3705

題目大意:有$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 3510

const 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個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出去的那個同...