题意:
分析:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 1010
#define MOD 1000000009
using namespace std;
typedef long long ll;
ll dp[MAXN][MAXN];
ll t,n,c,k;
ll sum[MAXN],vis[MAXN];
ll pw(ll x,ll y){
ll res=1;
while(y){
if(y&1ll)
res=res*x%MOD;
x=x*x%MOD;
y>>=1ll;
}
return res;
}
int main(){
freopen("gun.in","r",stdin);
freopen("gun.out","w",stdout);
SF("%lld",&t);
while(t--){
SF("%lld%lld%lld",&n,&c,&k);
memset(dp,0,sizeof dp);
ll c1=pw(c,MOD-2);
dp[1][0]=1;
for(int i=2;i<=n;i++){
ll add=(c-i+1)*c1%MOD;
memset(vis,0,sizeof vis);
memset(sum,0,sizeof sum);
int maxs=1;
for(int j=0;j<i;j++){
if(vis[j]==0){
int s=j+1;
maxs=s;
ll now=1;
while(vis[j]==0){
vis[j]=s;
if(j!=0)
sum[s-1]=(sum[s-1]+dp[i-1][j%(i-1)]*(i-1)%MOD*c1%MOD*now%MOD)%MOD;
j=(j+k)%i;
now=now*add%MOD;
}
}
}
ll cird=pw(add,i/maxs);
ll circ=pw(1-cird,MOD-2);
for(int j=0;j<maxs;j++){
for(int l=j;;){
dp[i][l]=sum[j]*circ%MOD;
sum[j]=sum[j]*add%MOD;
int l1=((l-k)%i+i)%i;
sum[j]=(sum[j]+dp[i-1][l1%(i-1)]*((1-cird%MOD)%MOD*(i-1)%MOD*c1%MOD)%MOD)%MOD;
l=l1;
if(l==j)
break;
}
}
}
for(int i=0;i<n;i++)
PF("%lld ",(dp[n][(n-i)%n]+MOD)%MOD);
PF("\n");
}
}