[JSOI2013]游戏中的学问
链接:https://www.luogu.com.cn/problem/P5259
题目描述:班里一共有\(N\)个同学,由\(1\)到\(N\)编号。究竟有多少种本质不同的拉手方案,使得最终大家散开后恰好形成\(k\)个圈呢?
题解:这是一道非常坑的题。你或许会体会到将斯特林数交上去然后\(wa\)掉的感觉。
仔细读题可以发现一个人不可以构成一个环,因为他不能拉自己的手,所以只要将斯特林数稍微改改就行了。
#include<iostream>
using namespace std;
long long n,k,mod,S[3001][3001];
int main()
{
cin>>n>>k>>mod;
S[0][0]=1;
for (int i=1;i<=3000;++i)
for (int j=1;j<=3000;++j)
{
if (i>=3)
S[i][j]=(S[i][j]+S[i-3][j-1]*(i-1)%mod*(i-2)%mod)%mod;
S[i][j]=(S[i][j]+S[i-1][j]*(i-1)%mod)%mod;
}
cout<<S[n][k]<<endl;
return 0;
}
本文来自博客园,作者:zhouhuanyi,转载请注明原文链接:https://www.cnblogs.com/zhouhuanyi/p/16983640.html