小朋友的球

题目描述

@发源于 小朋友最近特别喜欢球。有一天他脑子抽了,从口袋里拿出了N个不同的球,想把它们放到M个相同的盒子里,并且要求每个盒子中至少要有一个球,他好奇有几种放法,于是尝试编程实现,但由于他天天不好好学习,只会上B站看游泳教练,于是他向你求助。

输入输出格式

输入格式:

多组数据,每行两个数N,M。

输出格式:

每组数据一行,表示方案数。

输入输出样例

输入样例#1:

4 2
1 1

输出样例#1:

7
1

说明

【样例解释】

N=4,M=2

1,2 3 4

2,1 3 4

3,1 2 4

4,1 2 3

1 2,3 4

1 3,2 4

1 4,2 3

对于20%的数据,满足1≤N,M≤10;

对于100%的数据,满足1≤N,M≤100,数据组数≤10。

stirling数,递推公式s[i][j]=s[i-1][j]*j+s[i-1][j-1]

S(p,k)的一个组合学解释是:将p个物体划分成k个非空的不可辨别的(可以理解为盒子没有编号)集合的方法数。

k!S(p,k)是把p个人分进k间有差别(如:被标有房号)的房间(无空房)的方法数。

S(p,k)的递推公式是:S(p,k)=k*S(p-1,k)+S(p-1,k-1) ,1<= k<=p-1

边界条件:S(p,p)=1 ,p>=0 S(p,0)=0 ,p>=1

递推关系的说明:

考虑第p个物品,p可以单独构成一个非空集合,此时前p-1个物品构成k-1个非空的不可辨别的集合,方法数为S(p-1,k-1);

也可以前p-1种物品构成k个非空的不可辨别的集合,第p个物品放入任意一个中,这样有k*S(p-1,k)种方法。

高精度使用重载运算符会很方便

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 struct node{
 7     long long a[500],len;
 8     node()
 9     {memset(a,0,sizeof(a));len=0;}
10 };
11 node f[101][101];
12 node operator + (node c,node d)
13 {
14     node h;
15     h.len=max(c.len,d.len);
16     int i;
17     for(i=1;i<=h.len;i++){
18         h.a[i]+=c.a[i]+d.a[i];
19         if(h.a[i]>=10){
20             h.a[i+1]+=h.a[i]/10;
21             h.a[i]%=10;
22             if(i==h.len)h.len++;
23         }
24     }
25     return h;
26 }
27 node operator * (node c,long long u)
28 {
29     node h;
30     h.len=c.len;
31     int i;
32     for(i=1;i<=h.len;i++){
33         h.a[i]+=c.a[i]*u;
34         if(h.a[i]>=10){
35             h.a[i+1]+=h.a[i]/10;
36             h.a[i]%=10;
37             if(i==h.len)h.len++;
38         }
39     }
40     return h;
41 }
42 int main()
43 {int n,m,i,j;
44     while (cin>>n>>m)
45     {
46         if (n<m)
47         {
48             printf("0\n");
49         }
50         else if (n==m)
51         {
52             printf("1\n");
53         }
54         else
55         {
56             for (i=0;i<=n;i++)
57             f[i][i].a[1]=1,f[i][1].a[1]=1,f[i][i].len=f[i][1].len=1;
58             for (i=2;i<=n;i++)
59             {
60                 for (j=2;j<=i-1;j++)
61                  f[i][j]=f[i-1][j]*j+f[i-1][j-1];
62             }
63
64       for (i=f[n][m].len;i>=1;i--)
65       printf("%lld",f[n][m].a[i]);
66       printf("\n");
67         }
68
69     }
70 }
时间: 2024-11-12 08:01:54

小朋友的球的相关文章

洛谷P1655 小朋友的球(Stirling数)

P1655 小朋友的球 题目描述 @发源于 小朋友最近特别喜欢球.有一天他脑子抽了,从口袋里拿出了N个不同的球,想把它们放到M个相同的盒子里,并且要求每个盒子中至少要有一个球,他好奇有几种放法,于是尝试编程实现,但由于他天天不好好学习,只会上B站看游泳教练,于是他向你求助. 输入输出格式 输入格式: 多组数据,每行两个数N,M. 输出格式: 每组数据一行,表示方案数. 输入输出样例 输入样例#1: 4 2 1 1 输出样例#1: 7 1 说明 [样例解释] N=4,M=2 1,2 3 4 2,1

P1655 小朋友的球

题目描述 @发源于 小朋友最近特别喜欢球.有一天他脑子抽了,从口袋里拿出了N个不同的球,想把它们放到M个相同的盒子里,并且要求每个盒子中至少要有一个球,他好奇有几种放法,于是尝试编程实现,但由于他天天不好好学习,只会上B站看游泳教练,于是他向你求助. 输入格式 多组数据,每行两个数N,M. 输出格式 每组数据一行,表示方案数. 输入输出样例 输入 #1复制 4 2 1 1 输出 #1复制 7 1 说明/提示 [样例解释] N=4,M=2 1,2 3 4 2,1 3 4 3,1 2 4 4,1 2

[luogu1655][小朋友的球]

luogu1665 思路 一道第二类斯特兰数的模板题.只不过需要写个高精. f[i][j]表示前i个球放到j个盒子里的方案数.第i个球可以单独一个盒子,所以f[i][j]+=f[i-1][j-1].还可以与前面的放到同一个盒子里,所以f[i][j]+=f[i-1][j]*j #include<cstring> #include<cstdio> #include<iostream> using namespace std; struct BIGNUM { int n,a[

Luogu 考前模拟Round. 1

A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小朋友的球 题目:http://www.luogu.org/problem/show?pid=1655 赛中:sb题,第二类斯特林数,加个高精度就行了,我还写了个暴力对拍 赛后:卧槽 怎么只有80 未知错误怎么回事儿啊 C.命运的彼方 题目:http://www.luogu.org/problem/s

第二类Stirling数初探 By cellur925

上午noi.ac崩崩崩了,栽在组合数学上,虽说最后在辰哥&Chemist的指导下A掉了此题,也发现自己组合数学太弱了qwq. 在luogu上找题,结果找到了一个第二类斯特林数的题(还是双倍经验,逃.) 一.什么是第二类Stirling数 第二类斯特林数 S(n,k):把 n 个元素划分成 k 个集合的方案数.  这个问题说的实际一点,就比如说,有n个互异的小球,把他们放入m个盒子里,盒子里不允许为空的方案数.我们设s(i,j)表示放到i个小球,j个盒子的方案数. 那么对于每个小球,当前我们有两种

hdu 2208 唉,可爱的小朋友

Problem Description 唉, 小朋友是比较麻烦的.在一个幼儿园里,老师要上一节游戏课,有N个小朋友要玩游戏,做游戏时要用小皮球,但是幼儿园里只有M个小皮球,而且有些小朋友不喜 欢和一些小朋友在一起玩,而只喜欢和另一些小朋友一起玩,比如傻妞只喜欢和傻瓜,傻根,傻蛋们一起玩,傻根又不喜欢和傻蛋一起玩,傻蛋喜欢和傻子一起玩. 所以老师只好把他们分组,每个组至少有一个小球可以玩,而且每个组内不会有两个小朋友,相互不喜欢.现在给你这样一个幼儿园里小朋友之间关系的描述,做为 老师,是否可以上

【题解】放球游戏A

题目描述 校园里在上活动课,Red和Blue两位小朋友在玩一种游戏,他俩在一排N个格子里,自左到右地轮流放小球,每个格子只能放一个小球.每个人一次只能放1至5个球,最后面对没有空格而不能放球的人为输. 现在Red先走,问他有没有必胜的策略? 比如:N=6时,Red必败. 输入格式 一行,一个整数N(2<N<100). 输出格式 一行,一个整数.如果Red必胜输出1,否则输出0. 输入样例 9 输出样例 1 题解 先说结论,当$6|n$时,先手必输,否则先手必赢. 证明:当$6|n$时,先手放任

放球游戏B

题目描述 校园里在上活动课,Red和Blue两位小朋友在玩一种游戏,他俩在一排N个格子里,自左到右地轮流放小球,每个格子只能放一个小球.第一个人只能放1个球,之后的人最多可以放前一个人的两倍数目的球,至少放1个球.最后面对没有空格而不能放球的人为输. 现在Red先走,问他有没有必胜的策略? 比如:N=4时,Red必胜. 输入输出格式 输入格式: 一行,一个整数N(2<N<100). 输出格式: 一行,一个整数.如果Red必胜输出1,否则输出0. 输入输出样例 输入样例: 7 输出样例: 0 思

口袋中球的取出顺序问题,比赛名单问题

对于以下这两种问题是离散数学与概论在编程中的应用: 两个乒乓球队进行比赛,各队人.甲队为A,B,C     乙队为 X,Y,Z    抽签决定比赛名单.有人向队员打听比赛名单,A说他不和X比,C说他不和X,Z比,请编程序找出3组比赛名单 #include<stdio.h> void Game_list() { char i,j,k; /*i是a的对手;j是b的对手;k是c的对手*/ for (i='x';i<='z';i++) for (j='x';j<='z';j++) if (