码迷,mamicode.com
首页 > 其他好文 > 详细

多项式的次数

时间:2018-03-15 22:13:19      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:clu   参数   通过   lin   ati   ace   ++   bsp   log   

记多项式 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;
}

 

多项式的次数

标签:clu   参数   通过   lin   ati   ace   ++   bsp   log   

原文地址:https://www.cnblogs.com/Sdchr/p/8576226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!