N个箱子放入K个小球的方案数

https://zhidao.baidu.com/question/367173891541492052.html

结果为C(N+K-1,K)

思想为上面的挨个放入。

或者

将每个箱子都先放入一个球,即N个箱子,放入N+K个小球,箱子非空,然后再使用隔板法,得到C(N+K-1,N-1)。

例题:

https://atcoder.jp/contests/abc266/tasks/abc266_g

代码:

复制代码
#include<bits/stdc++.h>
#include<unordered_set>
#define fore(x,y,z) for(LL x=(y);x<=(z);x++)
#define forn(x,y,z) for(LL x=(y);x<(z);x++)
#define rofe(x,y,z) for(LL x=(y);x>=(z);x--)
#define rofn(x,y,z) for(LL x=(y);x>(z);x--)
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;

LL MOD = 998244353;
LL fac[3000010];
LL inv[3000010];
LL QPow(LL base, LL exp)
{
    LL res = 1;
    while (exp)
    {
        if (exp & 1)
        {
            res = res * base%MOD;
        }
        base *= base;
        base %= MOD;
        exp >>= 1;
    }
    return res;
}
int main()
{
    LL a, b, c;
    LL k;
    cin >> a >> b >> c >> k;
    a -= k;
    b -= k;
    fac[0] = fac[1] = 1;
    for (int i = 2; i <= 3000000; i++)
    {
        fac[i] = fac[i - 1] * i%MOD;
    }
    inv[3000000] = QPow(fac[3000000], MOD - 2);
    for (int i = 2999999; i >= 0; i--)
    {
        inv[i] = inv[i + 1] * (i + 1) % MOD;
    }

    LL res = 1;
    res *= fac[a + c + k] * inv[a]%MOD * inv[c]%MOD * inv[k]%MOD;
    res %= MOD;
    res *= fac[b + c + k] * inv[b] % MOD *inv[c + k] % MOD;
    res %= MOD;
    cout << res << endl;
    return 0;
}
View Code
复制代码

 

posted @   80k  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示