一个人的高三楼
题目链接:Click here
Solution:
题目名字有点伤感啊。。。
直接看题吧,\(k\)次前缀和,瞬间想到\(O(nk)\)的做法,20pts到手了,走吧!
回到正题。。。不难想到,我们构造一个生成函数\(G(x)=\sum_{i=0}^n x^i\),同时有\(A(x)=\sum_{i=1}^n a_ix^i\)
那么\(A\times G\)就相当于对\(A\)做了一次前缀和了,那么\(S_n^k=A\times G^k\),难道要多项式快速幂?
多项式快速幂是不可能的,这辈子都不可能的,考虑\(G\)的特殊性,它的每一项系数都是1
我们一下子就能发现,\(G^k\)与组合数的关系,\(G^k\)的第\(i\)项的系数就是\({i+k-1\choose k-1}\),不就是插板法吗
那么我们把\(G^k\)求出来之后,直接上\(NTT\)即可
Code:
#include
#define int long long
#define Pi acos(-1.0)
using namespace std;
const int N=4e5+11;
const int mod=998244353;
int n,m,k,len=1,tim,p[N];
int a[N],trans[N],inv[N];
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int qpow(int u,int t){
int re=1;
while(t){
if(t&1) re=re*u%mod;
t>>=1;u=u*u%mod;
}return re;
}
void NTT(int *v,int flag){
for(int i=0;i>1);u++,w=w*wn%mod){
int x=v[u],y=w*v[u+(l>>1)]%mod;
v[u]=(x+y)%mod;v[u+(l>>1)]=(x-y+mod)%mod;
}
}
}
}
signed main(){
n=m=read();k=read()%mod;++n;++m;
for(int i=1;i>1]>>1)|((i&1)<<(tim-1));
trans[0]=1;inv[1]=1;
for(int i=2;i<=len;i++) inv[i]=inv[mod%i]*(mod-mod/i)%mod;
for(int i=1;i