题解 P4948 数列求和
可能更好的阅读体验
题目大意
给定
答案对
题解
前置芝士:有限微积分
除了扰动法,本题还有一种较为简洁的有限微积分做法。
普通幂难以处理,用第二类斯特林数转为下降幂:
若
若
求出第二类斯特林数后
复杂度瓶颈为求第二类斯特林数,本题可
亦可使用 NTT
Code
/*
solution P4948 with finite calculus
made by wanrzone 2021-11-1 16:55
*/
#include<stdio.h>
#include<string.h>
typedef unsigned long long ull;
typedef unsigned int word;
const word mod=1e9+7;
inline ull pow_(word a,word b){//快速幂
word ans=1;
for(;b;b>>=1){
if(b&1) ans=1ull*ans*a%mod;
a=1ull*a*a%mod;
}
return ans;
}
word brace[2048][2048];//第二类斯特林数
word a,k,under[2048];
inline ull getans(ull num){
if(a==1){//a=1 的情况特判
num%=mod;
ull ans=0,get=1;
for(word i=0;i<=k;++i){
get=get*(num+mod-i)%mod;
ans+=pow_(i+1,mod-2)*brace[k][i]%mod*get%mod;
}
return ans%mod;
}
under[0]=pow_(a,num%(mod-1))*pow_(a-1,mod-2)%mod;
num%=mod;
for(word i=0;i<k;++i)
under[i+1]=(num+mod-i)*under[i]%mod;
//O(n) 递推 $\dfrac{x^{\underline{i}}a^x}{a-1}$
ull ans=0,get=0;
num=pow_(a-1,mod-2)*(mod-a)%mod;
for(word i=0;i<=k;++i){
get=(get*num%mod*i+under[i])%mod;
//O(k) 递推 $\sum x^{\underline{i}}a^x\delta x$
ans+=get*brace[k][i]%mod; //计入答案
}
return ans%mod;
}
ull n;
int main(){
scanf("%llu%u%u",&n,&a,&k);
brace[0][0]=1;
for(word n=1;n<=k;++n)//预处理第二类斯特林数
for(word m=1;m<=n;++m)
brace[n][m]=(1ull*m*brace[n-1][m]
+brace[n-1][m-1])%mod;
printf("%llu\n",(getans(n+1)+mod-getans(1))%mod);//不定和式->定和式
return 0;
}