d
≤
3
d\le3
d≤3,所以分类讨论
d
=
1
d=1
d=1就很简单了,快速幂即可
如果
d
=
̸
1
d=\not1
d≠1,考虑生成函数
F
(
x
)
=
∑
i
=
0
∞
[
d
∣
i
]
x
i
i
!
F(x)=\sum_{i=0}^{\infin}{[d|i]\frac{x^i}{i!}}
F(x)=i=0∑∞[d∣i]i!xi
单位根反演:
F
(
x
)
=
∑
i
=
0
∞
1
d
∑
j
=
0
d
−
1
(
ω
d
i
)
j
x
i
i
!
F(x)=\sum_{i=0}^{\infin}\frac{1}{d}\sum_{j=0}^{d-1}(\omega_d^i)^j\frac{x^i}{i!}
F(x)=i=0∑∞d1j=0∑d−1(ωdi)ji!xi
即
F
(
x
)
=
∑
i
=
0
∞
1
d
∑
j
=
0
d
−
1
(
ω
d
j
x
)
i
i
!
F(x)=\sum_{i=0}^{\infin}\frac{1}{d}\sum_{j=0}^{d-1}\frac{(\omega_d^jx)^i}{i!}
F(x)=i=0∑∞d1j=0∑d−1i!(ωdjx)i
d = 2 d=2 d=2, d = 3 d=3 d=3均可以暴力展开算
Code:
#include<bits/stdc++.h>
#define mod 19491001
#define ll long long
#define g 7
using namespace std;
inline int read(){
int res=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
return res*f;
}
const int N=5e5+5;
inline int add(int x,int y){x+=y;if(x>=mod) x-=mod;return x;}
inline int dec(int x,int y){x-=y;if(x<0) x+=mod;return x;}
inline int mul(int x,int y){return (ll)x*y%mod;}
inline void inc(int &x,int y){x+=y;if(x>=mod) x-=mod;}
inline void Dec(int &x,int y){x-=y;if(x<0) x+=mod;}
inline void Mul(int &x,int y){x=mul(x,y);}
inline int ksm(int a,int b){int res=1;for(;b;b>>=1,Mul(a,a)) if(b&1) Mul(res,a);return res;}
int fac[N],ifac[N];
inline int C(int n,int m){if(n<m) return 0;return mul(fac[n],mul(ifac[m],ifac[n-m]));}
int main(){
fac[0]=ifac[0]=1;
for(int i=1;i<=N-4;i++) fac[i]=mul(fac[i-1],i);
ifac[N-4]=ksm(fac[N-4],mod-2);
for(int i=N-5;i;i--) ifac[i]=mul(ifac[i+1],i+1);
ifac[0]=1;
int n=read(),k=read(),d=read();
int res=0;
if(d==1) {cout<<ksm(k,n);return 0;}
else if(d==2) {for(int i=0;i<=k;i++) inc(res,mul(C(k,i),ksm(dec(2*i,k),n)));Mul(res,ksm(ksm(2,k),mod-2));cout<<res;}
else{
int w=ksm(g,(mod-1)/3);
for(int i=0;i<=k;i++){
int ans=0;
for(int j=0;j<=k-i;j++)
inc(ans,mul(C(k-i,j),ksm((ll)(add(add(i,mul(w,j)),mul(mul(w,w),(k-i-j)))),n)));
inc(res,mul(ans,C(k,i)));
}
Mul(res,ksm(ksm(3,k),mod-2));
cout<<res;
}
return 0;
}