abc217g 题解

abc217g

思路

fi,jf_{i,j} 表示前 ii 个数分到 jj 组的情况数。

两种转移:

  • 新开一组。fi,j=fi1,j1f_{i,j}=f_{i-1,j-1}

  • 加入之前的组。在 ii 之前与 iimm 余数相同的有 i1m\frac{i-1}{m} 个,剩下 ji1mj-\frac{i-1}{m} 组可以加入。fi,j=fi1,j×(ji1m)f_{i,j}=f_{i-1,j}\times (j-\frac{i-1}{m})

最后答案为 fn,if_{n,i}

code

int n,m;
int f[maxn][maxn];

int T;
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);

	n=read();m=read();
	f[0][0]=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			f[i][j]=f[i-1][j-1];
			if(j>=(i+1)/m)f[i][j]+=f[i-1][j]*(j-(i-1)/m);
			f[i][j]%=mod;
//			cout<<f[i][j]<<" ";
		}
//		cout<<"\n";
	}
	for(int i=1;i<=n;i++)printf("%lld\n",f[n][i]);
}