当前位置:网站首页>CCPC 2021威海 - G. Shinyruo and KFC(组合数,小技巧)
CCPC 2021威海 - G. Shinyruo and KFC(组合数,小技巧)
2022-07-05 20:08:00 【小酒窝.】
G. Shinyruo and KFC
题意
一共有 n n n 种食物,每种食物有 a i a_i ai 个。食物个数总和不超过 1 0 5 10^5 105。
现在要把这些食物分给 k k k 个人,每个人可以拿多种事物,但每种食物最多拿 1 个。
对于 k k k 从 1 到 m m m,分别输出食物分配方案。
答案模 998244353 998244353 998244353。
1 ≤ m , n ≤ 5 ⋅ 1 0 4 1 \le m,n \le 5 \cdot 10^4 1≤m,n≤5⋅104
0 ≤ a i ≤ 1 0 5 , ∑ i = 1 n a i ≤ 1 0 5 0\le a_i\le 10^5,\ \sum_{i=1}^n a_i\le 10^5 0≤ai≤105, ∑i=1nai≤105
思路
对于一种食物共有 a i a_i ai 个,分给 k k k 个人,每人最多分一个,那么分配方案为 C ( k , a i ) C(k, ai) C(k,ai)。
那么 n 种食物,分给 k 个人总的分配方案为: ∏ i = 1 n C ( k , a i ) \prod_{i=1}^{n} C(k, a_i) ∏i=1nC(k,ai);
再遍历 m 个人,这样的话时间复杂度最低为 O(n * m),超时。
而题目中说 ai 总和不超过 1e5,那么 ai 的种类数就在 1 e 5 \sqrt {1e5} 1e5 级别,对于重复的直接用快速幂求幂次。
预处理逆元求组合数。
这样时间复杂度降为: O ( m n l o g n ) O(m \sqrt n \ logn) O(mn logn)
Code
#include<bits/stdc++.h>
using namespace std;
#define Ios ios::sync_with_stdio(false),cin.tie(0)
#define int long long
#define fi first
#define se second
#define endl '\n'
map<int,int> mp;
const int N = 200010, mod = 998244353;
int T, n, m;
int a[N];
struct node{
int x, cnt;
}b[N];
int fac[N], inv[N], finv[N];
int qmi(int x, int y)
{
int ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x*x % mod;
y >>= 1;
}
return ans;
}
void init(){
fac[0]=inv[0]=inv[1]=finv[0]=finv[1]=1ll;
for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%mod;
for(int i=2;i<N;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(int i=2;i<N;i++)finv[i]=finv[i-1]*inv[i]%mod;
}
inline int C(int a,int b){
if(b>a)return 0;
else return fac[a]*finv[a-b]%mod*finv[b]%mod;
}
signed main(){
Ios;
cin >> n >> m;
for(int i=1;i<=n;i++) cin >> a[i], mp[a[i]]++;
int cnt = 0;
for(auto it : mp)
{
cnt++;
b[cnt] = {
it.first, it.second};
}
init();
for(int i=1;i<=m;i++)
{
int ans = 1;
for(int j=1;j<=cnt;j++)
{
ans = ans * qmi(C(i, b[j].x), b[j].cnt) % mod;
}
cout << ans << endl;
}
return 0;
}
经验
- 如果 n 个数的总和不超过 m,那么这些数的种类个数在 m \sqrt m m 级别。
边栏推荐
- 再忙不能忘安全
- 【obs】libobs-winrt :CreateDispatcherQueueController
- leetcode刷题:二叉树17(从中序与后序遍历序列构造二叉树)
- Bitcoinwin (BCW) was invited to attend Hanoi traders fair 2022
- Build your own website (16)
- leetcode刷题:二叉树11(平衡二叉树)
- Leetcode skimming: binary tree 17 (construct binary tree from middle order and post order traversal sequence)
- C - sequential structure
- 《乔布斯传》英文原著重点词汇笔记(十二)【 chapter ten & eleven】
- Four methods of random number generation | random | math | threadlocalrandom | securityrandom
猜你喜欢
Go language | 03 array, pointer, slice usage
B站UP搭建世界首个纯红石神经网络、基于深度学习动作识别的色情检测、陈天奇《机器学编译MLC》课程进展、AI前沿论文 | ShowMeAI资讯日报 #07.05
ACM getting started Day1
实操演示:产研团队如何高效构建需求工作流?
建立自己的网站(16)
零道云新UI设计中
走入并行的世界
leetcode刷题:二叉树10(完全二叉树的节点个数)
【数字IC验证快速入门】8、数字IC中的典型电路及其对应的Verilog描述方法
Base du réseau neuronal de convolution d'apprentissage profond (CNN)
随机推荐
Force buckle 729 My schedule I
Thread pool parameters and reasonable settings
Android interview classic, 2022 Android interview written examination summary
Leetcode skimming: binary tree 12 (all paths of binary tree)
C language OJ gets PE, OJ of ACM introduction~
中金财富在网上开户安全吗?
sun. misc. Base64encoder error reporting solution [easy to understand]
Jvmrandom cannot set seeds | problem tracing | source code tracing
挖财钱堂教育靠谱安全吗?
通配符选择器
- Oui. Net Distributed Transaction and Landing Solution
. Net distributed transaction and landing solution
Notes on key vocabulary in the English original of the biography of jobs (12) [chapter ten & eleven]
Leetcode brush question: binary tree 14 (sum of left leaves)
2022年7月4日-2022年7月10日(ue4视频教程mysql)
Common operators and operator priority
字节跳动Dev Better技术沙龙成功举办,携手华泰分享Web研发效能提升经验
Interviewer: what is the internal implementation of set data types in redis?
实操演示:产研团队如何高效构建需求工作流?
Debezium series: modify the source code to support drop foreign key if exists FK