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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人