[BZOJ3453][tyvj1858]XLkxc-拉格朗日插值
2018-03-29 23:17
141 查看
XLkxc
Description
神犇LYD虐完HEOI之后给傻×XLk出了一题:SHY是某国的公主,平时的一大爱好是读诗…(中间略)…结果mod p就可以了
简明题意
给定 k,a,n,d,p
f(i)=1^k+2^k+3^k+……+i^k
g(x)=f(1)+f(2)+f(3)+….+f(x)
求(g(a)+g(a+d)+g(a+2d)+……+g(a+nd))mod p
对于所有数据
1<=k<=123
0<=a,n,d<=123456789
p==1234567891
Input
第一行数据组数,(保证小于6)以下每行四个整数 k,a,n,d
Output
每行一个结果。Sample Input
51 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
Sample Output
55
5
5
5
这个样例啊,亦可赛艇。
思路:
可以发现,f(x)f(x)就是一个自然数幂和。
那么通过差分可知,f(x)f(x)为一个k+1k+1次多项式。
同理根据差分可得g(x)g(x)为一个k+2k+2次多项式。
令h(x)=g(a)+g(a+d)+g(a+2∗d)+......+g(a+n∗d)h(x)=g(a)+g(a+d)+g(a+2∗d)+......+g(a+n∗d)
那么同样根据差分可以得到h(x)h(x)为一个k+3k+3次多项式。
于是考虑拉格朗日插值。
首先预处理处f(x)f(x),从而算出g(x)g(x)。
然后,插出g(x)g(x)以计算h(x)h(x)的前k+4k+4项。
最后,插出h(x)h(x)并计算答案。
然后就没有了……
记录一下重心拉格朗日插值的公式:
l(x)=∏i=1n(x−xi)l(x)=∏i=1n(x−xi)
wi=1∏j≠i(xi−xj)wi=1∏j≠i(xi−xj)
f(x)=l(x)∑i=1nwix−xif(x)=l(x)∑i=1nwix−xi
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll md=1234567891; const ll N=139; ll k,a,n,d; ll g ,f ,fac ,inv ,tl ,w ; inline ll qpow(ll a,ll b) { ll ret=1; while(b) { if(b&1)ret=ret*a%md; a=a*a%md;b>>=1; } return ret; } inline void init() { fac[0]=1; for(ll i=1;i<N;i++) fac[i]=fac[i-1]*i%md; inv[N-1]=qpow(fac[N-1],md-2); for(ll i=N-1;i>=1;i--) inv[i-1]=inv[i]*i%md; } inline ll cg(ll x,ll m,ll *y) { if(x<=m)return y[x]; ll l=1,sum=0; for(ll i=1;i<=m;i++) l=l*(x-i)%md; for(ll i=1;i<=m;i++) (sum+=w[i]*qpow(x-i,md-2)%md*y[i]%md)%=md; return sum*l%md; } inline ll initw(ll m) { for(ll i=1;i<=m;i++) w[i]=((((m-i)&1)?-1ll:1ll)*inv[m-i]*inv[i-1]%md+md)%md; } inline void mina() { scanf("%lld%lld%lld%lld",&k,&a,&n,&d); for(ll i=0;i<=k+3;i++) g[i]=qpow(i,k); for(ll i=1;i<=k+3;i++) (g[i]+=g[i-1])%=md; for(ll i=1;i<=k+3;i++) (g[i]+=g[i-1])%=md; initw(k+3); for(ll i=0;i<=k+4;i++) f[i]=cg((a+i*d)%md,k+3,g); for(ll i=1;i<=k+4;i++) f[i]=(f[i]+f[i-1])%md; initw(k+4); printf("%lld\n",cg(n,k+4,f)); } int main() { init(); int T;scanf("%d",&T); while(T--) mina(); return 0; }
相关文章推荐
- [tyvj 1858] bzoj3453 XLkxc [拉格朗日插值]
- 【BZOJ】3453: tyvj 1858 XLkxc 拉格朗日插值(自然数幂和)
- bzoj 3453: tyvj 1858 XLkxc
- 【BZOJ3453】XLkxc [拉格朗日插值法]
- bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
- 【bzoj3196】Tyvj 1730 二逼平衡树
- 【BZOJ1014】【tyvj3486】火星人prefix,Splay+字符串hash
- 【分块】bzoj3196 Tyvj 1730 二逼平衡树
- [BZOJ 3196]Tyvj 1730 二逼平衡树
- bzoj 3450: Tyvj1952 Easy
- bzoj3224: Tyvj 1728 普通平衡树(伸展树)
- [BZOJ3064][Tyvj1518]CPU监控-线段树
- 【bzoj3450】Tyvj1952 Easy 期望dp
- BZOJ 3224: Tyvj 1728 普通平衡树 vector
- 【BZOJ 1858】【SCOI 2010】序列操作【区间线段树】
- 3223: Tyvj 1729 文艺平衡树 - BZOJ
- Bzoj3223 Tyvj 1729 文艺平衡树
- Bzoj3450 Tyvj1952 Easy
- 【BZOJ 3450】Tyvj1952 Easy 期望概率dp+吐槽