• p1807[第二类Stirling数]盒子与球


    描述 Description
    现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子。问有多少种方法?
    例如:有2个不同的盒子(分别编为1号和2号)和3个不同的球(分别编为1、2、3号),则有6种不同的方法:

    1号盒子  1号球 1、2号球 1、3号球  2号球 2、3号球  3号球
    2号盒子 2、3号球  3号球  2号球 1、3号球  1号球 1、2号球

    输入格式 Input Format
    两个整数,n和r,中间用空格分隔。(0≤n, r≤10)

    输出格式 Output Format
    一个整数,如题目描述 

    样例输入 Sample Input
    3 2

    样例输出 Sample Output
    6

    时间限制 Time Limitation
    各个测试点1s

    注释 Hint
    第二类Stirling数。

        看到这个题的时候我第一时间认为这是一个用挡板法然后求一下组合数。然后在看看题emmmm.......

        这是不同的球和不同的盒子哇,好吧不会搞了.......

        然后去学了学第二类Stirling数。第二类Stirling数实际上是集合的一个拆分,表示将n个不同的元素拆分成m个集合的方案数,记为  或者 

             公式就是如下了

        

         这个第二类Stirling数就是用来求将n个不同元素分成m个集合的方案数了,所以这道题也是一个模板题

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int a[15][15];//当元素超过20的时候记得换成long long
    int main()
    {
        int n,r;
        cin>>n>>r;
        memset(a,0,sizeof(a));
        for(int i=1;i<15;i++)
            a[i][1]=1;
        for(int i=2;i<15;i++)
        {
            for(int j=1;j<=i;j++)
            {
                a[i][j]=a[i-1][j-1]+j*a[i-1][j];
            }
        }
        long long ans=1;
        for(int i=1;i<=r;i++)
            ans*=i;
        cout<<a[n][r]*ans<<endl;
        return 0;
    }
    ~( ̄▽ ̄~)(~ ̄▽ ̄)~
  • 相关阅读:
    Python 从零学起(纯基础) 笔记 之 collection系列
    ARM学习 之 如何在向内核写入系统调用
    idea的git使用案例
    idea使用git的pull命令报错1
    String、StringBuilder以及StringBuffer
    HashMap实现原理及源码分析
    logback使用注意点1
    创建zookeeper集群
    disconf安装问题
    linux更换jdk版本
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/7683446.html
Copyright © 2020-2023  润新知