Polynomial Construction - abc 137 f
#math
ヒント
すべて 0 の数列から, 1 ずつ足して 0, 1 の数列 a を構成する.
解法
a = 0 ... 0
から
a' = 0 0 ... 0 1 0 ... 0
と, i 番目のみ 1 にすることを考える.
a に対応する f(x) から, a' に対応する f'(x) を構成する.
f'(x) = f(x) + .
x = i のとき, x - i = 0 で, f'(x) = f(x) + 1.
x i のとき, (mod p) で, f'(x) = f(x).
x - i と素数 p が互いに素であることを示す.
.
ただし, x i.
-(p - 1) x - i p - 1.
ここで, x i より, x - i は p の倍数にならない.
以上より, 与えられる a に対して f(x) が求まったので, 各 x の冪乗の係数を求める.
tle 3000 * 3000 * 11 > 10^8
vector<int> b(p); rep(i, p) { if (a[i] == 0) continue; b[0]++; // (x-i)^(p-1) = (p-1)Cj x^j (-i)^(p-1-j) rep(j, p) { (b[j] += mod - COM(p - 1, j) * modpow(-i, p - 1 - j, mod) % mod) %= mod; } }
modpow のところを O(1) で計算できる.
j を後ろから走査して, -i をかけていく.
ソースコード
tle
https://atcoder.jp/contests/abc137/submissions/13663541
ac
https://atcoder.jp/contests/abc137/submissions/13663696