1 条题解

  • 0
    @ 2025-8-24 21:23:23

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar brealid
    @Pride205 你是xnn

    搬运于2025-08-24 21:23:22,当前版本为作者最后更新于2018-05-11 15:37:24,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题解:P1287 盒子与球

    不了解的:stirling数(斯特林数) - 百度百科

    分析如下:

    设有n个不同的球,分别用b1,b2,……bn表示。从中取出一个球bn,bn的放法有以下两种:

    1. bn独自占一个盒子;那么剩下的球只能放在m-1个盒子中,方案数为:f(n-1, m-1)
    1. bn与别的球共占一个盒子;那么可以事先将b1,b2,……bn-1这n-1个球放入m个盒子中,然后再将球bn可以放入其中一个盒子中,方案数为 :m*f(n-1,m)
    1. 边界条件
    1. a) 盒子数 < 0(盒子数“超支”),不成一种方案。

    2. b) 球数 < 盒子数(盒子数“超支”),不成一种方案。

    3. c) 球数 = 盒子数(正好),为一种方案。

    so...

    #define ll long long
    
    ll f(int n, int m)
    {
    	if (m <= 0 || n < m)
        	return 0;
        if (n == m)
        	return 1;
        else
        	return fun(n-1, m-1) + fun(n-1, m) * m;
    }
    

    and than...

    现有r个互不相同的盒子!!!

    不同!!!

    所以还要乘上盒子的排列组合

    #define ll long long
    
    ll fac(int i) // 然而这个函数不用讲什么
    {
    	if (i == 1)
        	return 1;
        else
        	return i * fac(i - 1);
    }
    

    so...

    int main() // 完美主程序
    {
        ll n, m;
        cin >> n >> m;
        cout<< f(n, m) * fac(m);
        return 0;
    }
    

    合成...

    #include <stdio.h>
    #include <iostream>
    #define ll long long
    using namespace std;
    
    ll f(int n, int m)
    {
        if (m <= 0 || n < m)
            return 0;
        if (n == m)
            return 1;
        else
            return fun(n-1, m-1) + fun(n-1, m) * m;
    }
    
    ll fac(int i) // 然而这个函数不用讲什么
    {
        if (i == 1)
            return 1;
        else
            return i * fac(i - 1);
    }
    
    int main() // 完美主程序
    {
        ll n, m;
        cin >> n >> m;
        cout<< f(n, m) * fac(m);
        return 0;
    }
    
    • 1

    信息

    ID
    286
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者