BSOJ5650题解

懒得写线性做法了,写个斯特林数混过去吧。其实是自己不熟悉

\[\sum_{i=1}^{n}i^kr^i \]

\[\sum_{i=1}^{n}\sum_{j=0}^{k}\begin{Bmatrix}k\\j\end{Bmatrix}i^{\underline{j}}r^i \]

\[\sum_{j=0}^{k}\begin{Bmatrix}k\\j\end{Bmatrix}\sum_{i=0}^{n}i^{\underline{j}}r^i \]

\[\sum_{i=j}^{n}i^{\underline{j}}r^i \]

这玩意儿好像不能做?

递推!

\(F[j]=\sum_{i=j}^{n}i^{\underline{j}}r^i\)

\[\sum_{i=j}^{n}(i-1)^{\underline{j}}r^i+j\times(i-1)^{\underline{j-1}}r^i \]

\[r\sum_{i=j}^{n-1}i^{\underline{j}}r^i+j\times r\sum_{i=j-1}^{n-1}i^{\underline{j-1}}r^i \]

\[F[j]=r\times(F[j]-n^{\underline{j}}r^n)+j\times r\times(F[j-1]-n^{\underline{j-1}}r^n) \]

\[F[j]=\frac{(n^{\underline{j}}+j\times n^{\underline{j-1}})r^{n+1}-j\times r\times F[j-1]}{r-1} \]

复杂度 \(O(k^2)\)

#include<cstdio>
typedef unsigned ui;
typedef unsigned long long ull;
const ui M=2005,mod=1e9+7;
ui T,k,r,S[M],F[M],pw[M];ull n,R;
inline ui pow(ui a,ui b=mod-2){
	ui ans(1);for(;b;b>>=1,a=1ull*a*a%mod)if(b&1)ans=1ull*ans*a%mod;return ans;
}
signed main(){
	scanf("%u",&T);
	while(T--){
		ui N,rn,inv,ans(0);scanf("%llu%u%llu",&n,&k,&R);S[0]=1;pw[0]=1;
		N=n%mod;r=R%mod;rn=pow(r,(n+1)%(mod-1));inv=pow(r-1,mod-2);F[0]=(rn-1ull)*inv%mod;
		if(!r){printf("0\n");continue;}
		for(ui i=1;i<=k;++i){
			pw[i]=pw[i-1]*(N+mod-i+1ull)%mod;
			for(ui j=i;j>=1;--j)S[j]=(S[j-1]+1ull*j*S[j])%mod;S[0]=0;
		}
		for(ui i=1;i<=k;++i)F[i]=(1ull*(pw[i]+1ull*i*pw[i-1])%mod*rn+1ull*(mod-r)*i%mod*F[i-1])%mod*inv%mod;
		for(ui i=0;i<=k;++i)ans=(ans+1ull*S[i]*F[i])%mod;printf("%u\n",ans);
		for(ui i=0;i<=k;++i)S[i]=F[i]=pw[i]=0;
	}
}
posted @ 2022-05-04 11:29  Prean  阅读(14)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};