标签:bzoj amp rac str lag main inline ++i i+1
求\(\displaystyle{\sum_{i=1}^n m^ii^m}(x\le 10^5,n\le10^9)\)
首先转为有更一般的形式\(\displaystyle{\sum_{i=1}^nm^if(i)}\)其中\(f(i)\)是\(x\)次多项式
\(\displaystyle{\sum m^xf(x)\delta x=g(x)m^x(+C)}\)
可得\(\displaystyle{\Delta g(x)m^x=f(x)m^x}\)
有\(g(x+1)=\frac{g(x)+f(x)}{m}\)
问题是我们不知道\(g(0)\)
设\(g(i)=A_ig(0)+B_i\)
可得\(A_{i+1}=\frac{A_i}{m},B_{i+1}=\frac{B_i+f(i)}{m}\)
但我们不知道\(g(0)\)
用到一个套路:利用高阶差分构建等量关系
即\[\Delta^{m+1}g(0)=\sum_{i=0}^{m+1}\binom{m+1}{i}(-1)^{m+1-i}g(i)=0\]
一一代入\(g(i)\)后变成一元一次方程可以解出\(g(0)\)
后面插值即可
答案式子\(\displaystyle{\sum_1^{n+1} m^xf(x)\delta x=g(n+1)m^{n+1}-g(0)}\)
int main(void){
re int i,up=0,down=0,Inv;scanf("%d%d",&n,&m);
if(m==1)return printf("%d\n",(int)(1ll*n*(n+1)/2%mod)),0;
Sieve();
Inv=qpow(m,mod-2);a[0]=1;b[0]=0;
for(i=1;i<=m+1;++i)a[i]=1ll*a[i-1]*Inv%mod,b[i]=1ll*(b[i-1]+pw[i-1])*Inv%mod;
for(i=0;i<=m+1;++i){
up=(up+((m+1-i)&1?-1ll:1ll)*C(m+1,i)*b[i])%mod,down=(down+((m+1-i)&1?-1ll:1ll)*C(m+1,i)*a[i])%mod;
}
g[0]=-1ll*up*qpow(down,mod-2)%mod;
for(i=1;i<=m+1;++i)g[i]=(1ll*a[i]*g[0]+b[i])%mod;
printf("%d\n",(int)(((1ll*lagrange(g,n+1)*qpow(m,n+1)-g[0])%mod+mod)%mod));
return 0;
}
标签:bzoj amp rac str lag main inline ++i i+1
原文地址:https://www.cnblogs.com/66t6/p/12284026.html