记多项式 f 的次数为 cf 。
原则:只考虑最高次项,忽略无关的参数和常数。
f + g 的次数为 max(cf, cg) 。
f * g 的次数为 cf + cg 。
f 复合 g 的次数为 cf * cg 。
自然数幂 S(d, n) 是 n 的 d+1 次多项式,可以通过扰动法得到递推式,然后根据归纳法得出。
f = sum g ,cf = cg + 1 。
一般情况 f = sum g(i ^ k),那么 cf = k cg + 1 ,写个式子吧
$g = \sum_i ^ n g(i ^ k) \approx \sum_i ^ n \sum_j ^ {cg} i ^ {jk} = \sum_j ^ {cg} S(jk, n), cf = \max_j(S(jk, n)) = cg * k + 1$
看一道简单题。
BZOJ 3453
f(n) = S(k, n)
g(n) = sum f(i)
h(n) = sum g(a + bi)
求 f 的某一项。
f 是 k+1 次的,g 是 k+2 次的,第三项可看作 h = sum g(i) ,所以是 k+3 次的。g 需要 k+3 个点才能确定,求出 g(1), g(2), ..., g(k+3),插值得 h(1), h(2), ..., h(k+4) ,再插值得到 h(n) 。
#include <bits/stdc++.h> using namespace std; #define F(i, s, t) for (int i = (s), _ = (t); i <= _; i ++) #define Fo(i, s, t) for (int i = (s), _ = (t); i < _; i ++) #define D(i, s, t) for (int i = (s), _ = (t); i >= _; i --) #define LL long long const int K = 150; const int P = 1234567891; int inv[K]; int T, k, a, n, d, p; int m, g[K], h[K]; int Pow(int x, int t) { int m = 1; for (; t; t >>= 1, x = (LL)x * x % P) if (t & 1) m = (LL)m * x % P; return m; } int La(int *a, int m, LL n) { n %= P; static int p[K], s[K]; p[0] = 1; F(i, 1, m) p[i] = p[i-1] * (n - i) % P; s[m+1] = 1; D(i, m, 1) s[i] = s[i+1] * (n - i) % P; int fin = 0; F(i, 1, m) fin = (fin + (LL)a[i] * inv[i-1] % P * inv[m-i] % P * (m-i & 1 ? -1 : +1) * p[i-1] % P * s[i+1]) % P; return fin; } int main() { #ifndef ONLINE_JUDGE freopen("3453.in", "r", stdin); #endif inv[1] = 1; Fo(i, 2, K) inv[i] = (LL)(P - P / i) * inv[P % i] % P; inv[0] = 1; Fo(i, 1, K) inv[i] = (LL)inv[i-1] * inv[i] % P; for (cin >> T; T --; ) { cin >> k >> a >> n >> d; m = k + 5; F(i, 1, m) g[i] = Pow(i, k); F(i, 1, m) g[i] = ((LL)g[i-1] + g[i]) % P; F(i, 1, m) g[i] = ((LL)g[i-1] + g[i]) % P; h[0] = La(g, m, a); F(i, 1, m) h[i] = ((LL)h[i-1] + La(g, m, a + (LL)i * d)) % P; cout << ((LL)La(h, m, n) + P) % P << endl; } return 0; }