集合的划分(东方化改题+不知道怎么就过了的题解)

我先吐槽一句……这标题总被我打成东方化该踢(

题目描述
设东方具有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和自攻自受,估计更多了

(反正我当时看投票结果页面要笑死

(没了

posted on 2018-02-25 15:37  bb机  阅读(153)  评论(0编辑  收藏  举报

导航