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

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

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

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

(没了

转载于:https://www.cnblogs.com/aristocrat/p/8469558.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值