集合的划分(东方化改题+不知道怎么就过了的题解)
我先吐槽一句……这标题总被我打成东方化该踢(
题目描述
设东方具有n 个少女,她们的集合是s={a1,a2,……,an}
(我们用一个数代表一个少女(比如说⑤,⑥,⑨,⑩)),现将
s划分成K 个满足下列条件的子集合s1,s2,……,sk ,以便于
凑出人气投票时的cp,且满足:
1.si≠φ(cp不能没有人,但可以自攻自受)
2.si∩sj=φ (1≤i,j≤k i≠j)(这个……一个少女不能分身成两个啊(二小姐表示不服))
3.s1∪s2∪s3∪…∪sk=s(不能有不认识的孩子)
(啊我承认这个题被我改的很烂。可能是我更希望有一个排列组合的题,所以就生搬硬套了
则称s1,s2,……,sk是集合s的一个划分。
现在要求出所有贵圈真乱的划分。
输入
一行两个整数n、k
输出
一行,一个整数s(n,k)
这个题我听那些男生说要用高精度,否则会爆longlong,但是我为什么就过了呢
1 #include<cstdio> 2 using namespace std; 3 long long s[31][31]; 4 int main() 5 { 6 freopen("setsub.in","r",stdin); 7 freopen("setsub.out","w",stdout); 8 int n,k; 9 scanf("%d%d",&n,&k); 10 s[0][0] = 1; //边界条件 11 s[1][0] = 0; 12 s[0][1] = 0; 13 for(int i = 1;i <= n;i++){ 14 for(int j = 1;j <= k;j++){ 15 if(j > i) s[i][j] = 0; //不存在的 16 else s[i][j] = j * s[i - 1][j] + s[i - 1][j - 1]; //递推式子 17 } 18 } 19 printf("%lld",s[n][k]); 20 return 0; 21 }
相信大家都会这个题,就算不会也能看懂
标程好像给的是递归?那就贴一下
1 #include<iostream> 2 using namespace std; 3 int n,k; 4 int f(int p,int q) 5 { 6 if(q==1)return 1; 7 else if(p<q)return 0; 8 else return f(p-1,q-1)+q*f(p-1,q); 9 } 10 int main() 11 { 12 cin>>n>>k; 13 cout<<f(n,k); 14 return 0; 15 }
我能写递推肯定不写递归,所以就懒得分析了。
另外说一个之前贴吧看到的:东方人气cp投票(打一人物)——千百合
据说有1100多对cp
当然这是日本那边的
天朝的人气投票允许3p和自攻自受,估计更多了
(反正我当时看投票结果页面要笑死
(没了