快速拉格朗日插值法的模板

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1010
typedef long long LL;
const LL mod = 1e9 + 7;

LL powmod(LL aa, LL x) {
    LL res = 1;
    for(; x > 0; x >>= 1) {
        if(x & 1)res = (res * aa) % mod;
        aa = (aa * aa) % mod;
    }
    return res;
}

struct lagrange {
#define ll long long
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define D 2010 //D比MAXN大100就行
    ll a[D], f[D], g[D], p[D], p1[D], p2[D], b[D], h[D][2], C[D];
    void init(int M) {//初始化:参数填MAXN + 20
        f[0] = f[1] = g[0] = g[1] = 1;
        rep(i, 2, M + 5) f[i] = f[i - 1] * i % mod;
        g[M + 4] = powmod(f[M + 4], mod - 2);
        per(i, 1, M + 4) g[i] = g[i + 1] * (i + 1) % mod;
    }
    /*给定一组样本数据a[],规模为0-d,计算出第n项*/
    ll calcn(int d, ll *a, ll n) {
        if (n <= d) return a[n];
        p1[0] = p2[0] = 1;
        rep(i, 0, d + 1) {
            ll t = (n - i + mod) % mod;
            p1[i + 1] = p1[i] * t % mod;
        }
        rep(i, 0, d + 1) {
            ll t = (n - d + i + mod) % mod;
            p2[i + 1] = p2[i] * t % mod;
        }
        ll ans = 0;
        rep(i, 0, d + 1) {
            ll t = g[i] * g[d - i] % mod * p1[i] % mod * p2[d - i] % mod * a[i] % mod;
            if ((d - i) & 1) ans = (ans - t + mod) % mod;
            else ans = (ans + t) % mod;
        }
        return ans;
    }
    /*
    给定一组观测点(0, a[0]), (1, a[1]), ...,(m, a[m]),、
    样本点的个数为a(x)的最高次+1。
    求在该函数模型下,a[0]+a[1]+...+a[n]的和。
    */
    ll ta[D];
    ll polysum(ll m, ll *a, ll n) { // 给定a[0].. a[m],求\sum_{i=0}^{n}a[i]
        memcpy(ta, a, sizeof(a[0]) * (m + 1));
        ta[m + 1] = calcn(m, ta, m + 1);
        rep(i, 1, m + 2)ta[i] = (ta[i - 1] + ta[i]) % mod;
        return calcn(m + 1, ta, n);
    }
};

 

转载于:https://www.cnblogs.com/fuzhihong0917/p/9363554.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值