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 3

1 2,3 4

1 3,2 4

1 4,2 3

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

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

洛谷题解:

  • 简单的动态规划,但是要加上高精度运算,不然只能得 20 分。本题和 放苹果 有些类似,但是盒子不能空着不放,也就是楼下所说的 Stirling数,应用于组合数学领域

  • 状态转移方程:f[i][j]=f[i−1][j−1]+f[i−1][j]×j

加一个盒子加一个球

加一个球

为什么不能加一个盒子,肯定不能加一个盒子,因为之前的是固定的

状态怎么转移

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)种方法。

注意:当m>n||m==0时直接输出0,!!!因为这个wa了好多次 也就只要加上高精就行了,先贴上c++代码:

 #include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 999999999
#define For(i,a,b) for(i=a;i<=b;++i)
#define rep(i,a,b) for(i=a;i>=b;--i)
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
ll read(){
ll sum=,flag=;
char c=getchar();
while(c<''||c>''){if(c=='-')flag=-;c=getchar();}
while(c>=''&&c<='')sum=sum*+c-'',c=getchar();
return sum*flag;
}
ll maxx(ll x,ll y){
if(x<y)return y;
return x;
}
ll minn(ll x,ll y){
if(x<y)return x;
return y;
}
ll abss(ll x){
if(x>=)return x;
return -x;
}
struct node{
ll a[],len;
node(){mm(a,);len=;}//记得初始化
};
node t[][];
node operator + (node c,node d){
node h;h.len=maxx(c.len,d.len);
int i;
for(i=;i<=h.len;i++){
h.a[i]+=c.a[i]+d.a[i];
if(h.a[i]>=){
h.a[i+]+=h.a[i]/;
h.a[i]%=;
if(i==h.len)h.len++;
}
}
return h;
}
node operator * (node c,ll u){
node h;h.len=c.len;
int i;
for(i=;i<=h.len;i++){
h.a[i]+=c.a[i]*u;
if(h.a[i]>=){
h.a[i+]+=h.a[i]/;
h.a[i]%=;
if(i==h.len)h.len++;
}
}
return h;
}
int main(){
ll i,j,m,n;
For(i,,)t[i][].a[]=,t[i][i].a[]=t[i][].a[]=,t[i][].len=t[i][i].len=t[i][].len=;
For(i,,){
For(j,,i-){
t[i][j]=t[i-][j-]+t[i-][j]*j;
}
}
while(scanf("%lld%lld",&m,&n)!=EOF){
if(n==||n>m){printf("0\n");continue;}
rep(i,t[m][n].len,)printf("%lld",t[m][n].a[i]);
printf("\n");
}
return ;
}

P1655 小朋友的球的更多相关文章

  1. 洛谷——P1655 小朋友的球

    P1655 小朋友的球 题目描述 @发源于 小朋友最近特别喜欢球.有一天他脑子抽了,从口袋里拿出了N个不同的球,想把它们放到M个相同的盒子里,并且要求每个盒子中至少要有一个球,他好奇有几种放法,于是尝 ...

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

    P1655 小朋友的球 题目描述 @发源于 小朋友最近特别喜欢球.有一天他脑子抽了,从口袋里拿出了N个不同的球,想把它们放到M个相同的盒子里,并且要求每个盒子中至少要有一个球,他好奇有几种放法,于是尝 ...

  3. 洛谷 P1655 小朋友的球

    题目描述 @发源于 小朋友最近特别喜欢球.有一天他脑子抽了,从口袋里拿出了N个不同的球,想把它们放到M个相同的盒子里,并且要求每个盒子中至少要有一个球,他好奇有几种放法,于是尝试编程实现,但由于他天天 ...

  4. [luogu1655][小朋友的球]

    luogu1665 思路 一道第二类斯特兰数的模板题.只不过需要写个高精. f[i][j]表示前i个球放到j个盒子里的方案数.第i个球可以单独一个盒子,所以f[i][j]+=f[i-1][j-1].还 ...

  5. Luogu1655 小朋友的球 (组合数学,第二类斯特林数,高精)

    我bingoyes再高精用STL就饿死,死外边! string真的爽... 斯特林数模板题:\(S(n,m) = S(n-1,m-1)+S(n-1,m)*n\) #include <iostre ...

  6. Luogu 考前模拟Round. 1

    A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小 ...

  7. 第二类Stirling数初探 By cellur925

    上午noi.ac崩崩崩了,栽在组合数学上,虽说最后在辰哥&Chemist的指导下A掉了此题,也发现自己组合数学太弱了qwq. 在luogu上找题,结果找到了一个第二类斯特林数的题(还是双倍经验 ...

  8. 放球游戏B

    题目描述 校园里在上活动课,Red和Blue两位小朋友在玩一种游戏,他俩在一排N个格子里,自左到右地轮流放小球,每个格子只能放一个小球.第一个人只能放1个球,之后的人最多可以放前一个人的两倍数目的球, ...

  9. 【题解】放球游戏B

    题目描述 校园里在上活动课,Red和Blue两位小朋友在玩一种游戏,他俩在一排N个格子里,自左到右地轮流放小球,每个格子只能放一个小球.第一个人只能放1个球,之后的人最多可以放前一个人的两倍数目的球, ...

随机推荐

  1. Delphi 类(TApplication)

    TApplication类用于开发窗口程序的类.此类封装了一个窗口应用程序,其方法和属性反映了窗口操作系统在建立.执行.维持以及析构该程序等方面的基本原则.Delphi的每个窗口程序都会自动声明一个A ...

  2. CSS制作红桃心

    这里主要用到了before与after属性之前之后 代码: <!DOCTYPE html> <html> <head> <meta charset=" ...

  3. Openstack组件部署 — Nova_Install and configure a compute node

    目录 目录 前文列表 Prerequisites 先决条件 Install and configure a compute node Install the packages Edit the etc ...

  4. java连连看小项目

    /* *本人也是刚入门,希望各位多多指教 *该项目主要代码在于连线 *1.2个连线没有拐弯 *2.2个连线有一个拐弯 *3.2个连线有2个拐弯 *采用递归算法 */ package llk; impo ...

  5. Codeforces 1169A Circle Metro

    题目链接:codeforces.com/contest/1169/problem/A 题意:有俩个地铁,一个从 1 → 2 → …→ n → 1→ 2 →…, 一个 从 n → n-1 →…→ 1 → ...

  6. Jackson第一个程序

    再进入学习jackson库的细节之前,让我们来看看应用程序操作功能.在这个例子中,我们创建一个Student类.将创建一个JSON字符串学生的详细信息,并将其反序列化到学生的对象,然后将其序列化到JS ...

  7. firewall防火墙配置

    获取所有zone firewall-cmd --list-all-zones 重启服务 firewall-cmd --complete-reload 名词解释 在具体介绍zone之前学生先给大家介绍几 ...

  8. 高程(三)----数组Array

      一.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上 ...

  9. pytest--两个fixture时,灵活运用

    import pytest@pytest.fixture()def login_r(open_browser): print('登陆') @pytest.fixture()def open_brows ...

  10. Linux下NODE配置NODE_PATH变量

    在当我们使用了npm install express -g安装之后的,会安装在全局目录下,但是如果直接用Node来启动程序的话,是无法发现这个包的,原因就在于NODE_PATH这个环境变量设置的不正确 ...