AtCoder Beginner Contest 215 G - Colorful Candies 2
AtCoder Beginner Contest 215 G - Colorful Candies 2
有n個糖果,每個糖果有著一個顏色a[i],每次拿k個糖果期望拿到E(x)個不同顏色的糖果,求出k從1~n分別得到的E(x)。最終答案mod998244353。
數據范圍n <= 5e4
看到這個問題首先反應是答案和顏色的具體值以及出現的順序無關,所以離散化之后用一個cnt數組記錄他們分別的出現次數之后就可以不用去管a[i]了。
之后可以發現,要求出選k個糖果后不同顏色的糖果的期望值,就是求出每一種顏色的糖果至少出現一次的概率,然后求和。P(至少出現一次)=1-P(一次都不出現),而一次都不出現的概率,假如當前這個顏色的糖果有x個,那么就是Cn?xk/CnkC_{n-x}^{k}/C_n^kCn?xk?/Cnk?。
如果就這樣暴力求解的話,最終的復雜度最壞為O(n2)O(n^2)O(n2)的,不過可以想到很明顯的優化,一個是當k>n-x時一次都不出現的概率為0,所以可以將cnt的值進行排序然后從小到大枚舉,一旦達到k>n-cnt[i]的條件就可以直接跳出循環。另一個就是相同是cnt進行去重,求出的答案直接乘以相同cnt的數量,由于∑cnt=n\sum cnt=n∑cnt=n,當滿足cnt直接各不相同時,cnt個數為O(n)O(\sqrt n)O(n?)。這樣總復雜度就是O(nn)O(n\sqrt n)O(nn?),時限給4秒很寬松。
#include <bits/stdc++.h> #define f(i, l, r) for(int i = l; i <= r; i ++) #define nf(i, r, l) for(int i = r; i >= l; i --) typedef long long ll; using namespace std;const int N = 5e4 + 10, mod = 998244353; int a[N], cnt[N], tot, ccnt[N]; long long jc[N], ny[N];long long C(int n, int m, int num) {if (m == 0 || m == n)return 1;long long res = 1;if (!num){res = jc[n] * ny[m];res %= mod;res *= ny[n - m];res %= mod;}else{res = jc[m] * jc[n - m];res %= mod;res *= ny[n];res %= mod;}return res; }long long qpow(long long x, int y) {long long res = 1;while (y){if (y & 1){res *= x;res %= mod;}x *= x;x %= mod;y >>= 1;}return res; }void init(int n) {jc[0] = 1;f(i, 1, n){jc[i] = jc[i - 1] * i;jc[i] %= mod;}f(i, 1, n)ny[i] = qpow(jc[i], mod - 2); }int main() {#ifdef jinxes6freopen("in.txt", "r", stdin);#endifios::sync_with_stdio(false);cin.tie(0);int T = 1;//cin >> T;while (T --){int n;cin >> n;init(n);f(i, 1, n)cin >> a[i];sort (a + 1, a + n + 1);f(i, 1, n){if (a[i] > a[i - 1])cnt[++ tot] = 1;elsecnt[tot] ++;}sort (cnt + 1, cnt + tot + 1);int p = 1, t = tot;f(i, 1, tot){if (cnt[p] != cnt[i]) {ccnt[++ p] = 1;cnt[p] = cnt[i];}elseccnt[p] ++;}tot = p;f(i, 1, n){long long ans = t;f(j, 1, tot){if (i > n - cnt[j])break;long long temp = C(n - cnt[j], i, 0) * C(n, i, 1) % mod;temp = temp * ccnt[j] % mod;ans = (ans - temp + mod) % mod;}cout << ans << "\n";}}return 0; } 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的AtCoder Beginner Contest 215 G - Colorful Candies 2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java文件保存与删除工具类
- 下一篇: tensorflow随笔-读文件