【bzoj3157/3516/4126】国王奇遇记

\(\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;
}

猜你喜欢

转载自www.cnblogs.com/66t6/p/12284026.html