求
[sum_{i=1}^ni^mm^i
]
(nleq 10^9,mleq 10^3)
看起来是个暴力好题,考虑倍增暴力搞,即从(sum_{i=1}^ni^mm^i)推到(sum_{i=1}^{2n}i^mm^i)
[sum_{i=1}^{2n}i^mm^i=sum_{i=1}^ni^mm^i+m^nsum_{i=1}^n(i+n)^{m}m^{i}
]
这个(sum_{i=1}^n(i+n)^{m}m^{i})二项式定理一下,就是(sum_{i=1}^nm^isum_{k=0}^minom{m}{k}i^kn^{m-k})
交换一下(sum),并拆开组合数,就是
[m!sum_{k=0}^mfrac{n^{m-k}}{(m-k)!} imes frac{sum_{i=1}^ni^km^i}{k!}
]
显然是一个卷积的形式,暴力做就是(O(m^2log n))的,可以优化到(O(mlog mlog n))但不是NTT模数就算了吧
还有这题怎么1s时限啊,好像只有在DB上能勉强跑过去
代码
#include<bits/stdc++.h>
#define re register
const int mod=1e9+7;
inline int dqm(int x) {return x<0?x+mod:x;}
inline int qm(int x) {return x>=mod?x-mod:x;}
inline int ksm(int a,int b) {
int S=1;for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)S=1ll*S*a%mod;return S;
}
int n,m,fac[1005],ifac[1005],ans[1005],g[1005],h[1005];
void solve(int n,int *f) {
if(n==1) {for(re int i=0;i<=m;i++) f[i]=m;return;}
solve(n>>1,f);int k=n;k>>=1;
for(re int i=0;i<=m;i++) g[i]=f[i];
for(re int i=0;i<=m;i++) g[i]=1ll*g[i]*ifac[i]%mod;
for(re int nw=1,i=0;i<=m;i++,nw=1ll*nw*k%mod) h[i]=1ll*ifac[i]*nw%mod;
for(re int t=0,i=m;i>=0;g[i]=t,--i,t=0)
for(re int j=0;j<=i;j++) t=qm(t+1ll*g[i-j]*h[j]%mod);
for(re int i=0;i<=m;i++) g[i]=1ll*g[i]*fac[i]%mod;
for(re int t=ksm(m,k),i=0;i<=m;i++) f[i]=qm(f[i]+1ll*g[i]*t%mod);
if(!(n&1)) return;int t=ksm(m,n);
for(re int nw=1,i=0;i<=m;i++,nw=1ll*nw*n%mod) f[i]=qm(f[i]+1ll*t*nw%mod);
}
int main() {
scanf("%d%d",&n,&m);ifac[0]=fac[0]=1;
for(re int i=1;i<=m;i++) fac[i]=1ll*fac[i-1]*i%mod;
ifac[m]=ksm(fac[m],mod-2);
for(re int i=m-1;i;--i) ifac[i]=1ll*ifac[i+1]*(i+1)%mod;
solve(n,ans);printf("%d
",ans[m]);return 0;
}
之后(O(m^2))蛮经典的,可以用我曾经瞎搞的一个方法来搞
设(f(k)=sum_{i=1}^ni^km^i)
则
[egin{aligned}
(1-m)f(k)&=sum_{i=1}^ni^km^i-sum_{i=1}^ni^km^{i+1}\
&=sum_{i=1}^ni^km^i-sum_{i=1}^{n+1}(i-1)^km^i\
&=-n^km^{n+1}+sum_{i=1}^n(i^k-(i-1)^k)m^i\
&=-n^km^{n+1}+sum_{i=1}^n(i^k-sum_{j=0}^kinom{k}{j}i^j(-1)^{k-j})m^i\
&=-n^km^{n+1}-sum_{i=1}^nm^isum_{j=0}^{k-1}inom{k}{j}i^j(-1)^{k-j}\
&=-n^km^{n+1}-k!sum_{j=0}^{k-1}frac{(-1)^{k-j}}{(k-j)!} imes frac{sum_{i=1}^ni^jm^i}{j!}\
&=-n^km^{n+1}-k!sum_{j=0}^{k-1}frac{(-1)^{k-j}}{(k-j)!} imes frac{f(j)}{j!}
end{aligned}
]
(O(m))做法不会了,告辞