可以先构造生成函数,然后单位根反演
当 d = 2 时 , 需要自己与自己卷 k 次,然后求第 n 项
泰勒展开一下,第 n 项就是
当 d = 3时,直接暴力枚举 w(3, 0), w(3, 1), w(3, 2) 出现了多少次
#include<bits/stdc++.h>
#define N 500050
using namespace std;
typedef long long ll;
const int Mod = 19491001, G = 18827933;
int n, k, d;
ll fac[N], inv[N];
ll mul(ll a, ll b){ return a * b % Mod;}
ll add(ll a, ll b){ return (a + b) % Mod;}
ll power(ll a, ll b){ ll ans = 1;
a = add(a, Mod);
for(;b;b>>=1){ if(b&1) ans = mul(ans, a); a = mul(a, a);}
return ans;
}
ll C(int n, int m){ return mul(mul(fac[n], inv[n-m]), inv[m]);}
int main(){
scanf("%d%d%d", &n, &k, &d);
fac[0] = fac[1] = inv[0] = inv[1] = 1;
for(int i = 2; i <= k; i++) fac[i] = mul(fac[i-1], i);
inv[k] = power(fac[k], Mod - 2);
for(int i = k-1; i >= 2; i--) inv[i] = mul(inv[i+1], i+1);
if(d == 1){ printf("%lld", power(k, n)); return 0;}
if(d == 2){
ll ans = 0;
for(int i = 0; i <= k; i++){
ans = add(ans, mul(C(k, i), power(2 * i - k, n)));
} ans = mul(ans, power(power(2, Mod - 2), k));
cout << ans;
}
if(d == 3){
ll ans = 0;
ll w0 = 1, w1 = mul(w0, power(G, (Mod-1) / 3)), w2 = mul(w1, w1);
for(int i = 0; i <= k; i++){
for(int j = 0; j <= k; j++){
if(i + j > k) break;
int l = k - i - j;
ll v = mul(mul(fac[k], inv[i]), mul(inv[j], inv[l]));
ll tmp = add(mul(i, w0), add(mul(j, w1), mul(l, w2)));
ans = add(ans, mul(v, power(tmp, n)));
}
} ans = mul(ans, power(power(3, Mod - 2), k));
cout << ans;
} return 0;
}