首页 > 其他分享 >Solution - Atcoder ARC150D Removing Gacha

Solution - Atcoder ARC150D Removing Gacha

时间:2024-07-08 20:09:05浏览次数:9  
标签:Atcoder frac limits int Removing sum 选中 maxn Gacha

考虑到每次操作都比定会选上一个点,于是答案可以表示为每个点被选中的次数之和。
即令 \(c_i\) 为 \(i\) 点被选中的次数,答案即为 \(E(\sum\limits_{i = 1}^n c_i)\)。

根据期望的线性性,考虑把答案的 \(E\) 拆到每个 \(c_i\) 上,即变为 \(\sum\limits_{i = 1}^n E(c_i)\) 的形式。

那么对于每个点 \(i\) 就很好的独立开了。
考虑到因为这个选取点是仅与其祖先有关的,所以可以考虑用深度 \(d = \operatorname{dep}_i\) 来表示其对应的期望次数。
即令 \(f_d\) 为深度为 \(d\)(一条长为 \(d\) 的链)的点期望被选取的次数,把答案转为 \(\sum\limits_{i = 1}^{n} f_{\operatorname{dep}_i}\)。

接下来考虑求解 \(f_d\)。
因为这里是均匀随机的去做,所以对于包括其祖先的这 \(d\) 个点的被选中的期望次数应该是相同的。
所以考虑转为总共期望多少次能够把 \(d\) 个点都选中。
这个可以考虑已经选中了 \(i\) 个点,那么下一次选中一个未被选中的点的概率就是 \(\frac{d - i}{d}\),对应的期望次数就是 \(\frac{d}{d - i}\)。
所以总的期望次数就是 \(\sum\limits_{i = 0}^{d - 1} \frac{d}{d - i} = \sum\limits_{i = 1}^d \frac{d}{i} = d\times \sum\limits_{i = 1}^d \frac{1}{d}\)。
所以有 \(f_d = \dfrac{d\times \sum\limits_{i = 1}^d \frac{1}{d}}{d} = \sum\limits_{i = 1}^d \frac{1}{d}\)。

时间复杂度 \(\mathcal{O}(n)\)。

#include<bits/stdc++.h>
using ll = long long;
constexpr ll mod = 998244353;
const int maxn = 2e5 + 10;
ll inv[maxn], f[maxn];
int fa[maxn], dep[maxn];
int main() {
   int n; scanf("%d", &n);
   dep[1] = 1;
   for (int i = 2; i <= n; i++) {
      scanf("%d", &fa[i]);
      dep[i] = dep[fa[i]] + 1;
   }
   inv[0] = inv[1] = 1ll;
   for (int i = 2; i <= n; i++)
      inv[i] = inv[mod % i] * (mod - mod / i) % mod;
   for (int i = 1; i <= n; i++)
      f[i] = (f[i - 1] + inv[i]) % mod;
   ll ans = 0;
   for (int i = 1; i <= n; i++)
      (ans += f[dep[i]]) %= mod;
   printf("%lld\n", ans);
   return 0;
}

标签:Atcoder,frac,limits,int,Removing,sum,选中,maxn,Gacha
From: https://www.cnblogs.com/rizynvu/p/18290632

相关文章

  • Denso Create Programming Contest 2024(AtCoder Beginner Contest 361)E-F
    E求一条树上的路径,使得走遍整棵树花费最小。我们容易发现树上的某条简单路径只需走一次,除此之外所有的路径都需要走两次,那么显而易见,我们需要求树的直径,之后将剩余的路径权值和乘二加上直径权值就可以。F数学题,对于数学题而言,个人感觉时间复杂度的计算对于题目的求解非常重......
  • AtCoder Beginner Contest 361
    AtCoderBeginnerContest361A-Insert给定一个长度为\(N\)的序列\(A\),现在希望将数字\(X\)插入到序列的第\(K\)个数字后面,变成一个新的序列\(B\)。输出序列\(B\)。\(K,N,A_i,X\le100\)模拟题。先读入\(N,K,X\)。接着在读入\(A\)的过程中一遍读入一遍输出,如果读到了第\(K......
  • AtCoder Beginner Contest 361)
    推荐个C++编程仓库模板https://github.com/yxc-s/programming-templateA-Insertvoidsolve(){ intn,k,x; cin>>n>>k>>x; vector<int>a(n); for(auto&x:a){ cin>>x; } a.insert(a.begin()+k,x); for(inti=0;......
  • Denso Create Programming Contest 2024(AtCoder Beginner Contest 361)
    DensoCreateProgrammingContest2024(AtCoderBeginnerContest361)\(A\)Insert\(AC\)循环结构。点击查看代码inta[200];intmain(){intn,k,x,i;cin>>n>>k>>x;for(i=1;i<=n;i++){cin>>a[i];cout......
  • AtCoder Beginner Contest 361 补题记录(A~F)
    开题顺序:A-C-F-D-B-E。A直接模拟即可。boolbegmem;#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;classFastIO{public:intread(){into=1,x;charch;while(!isdigit(ch=getchar())){if......
  • Solution - Atcoder ARC125E Snack
    观察到这种都是数量上限的限制,且求\(\max\)。所以可以考虑网络流建模,而流量就对应着给的糖果数。令\(S\)为源点,\(T\)为汇点,编号为\(1\simn\)的点对应的糖果的种类,编号为\(n+1\simn+m\)的点对应的小孩。连边\((S,i,a_i)\),表示第\(i\)种糖果数不超过\(a_i\)......
  • AtCoder Beginner Contest 359
    AtCoderBeginnerContest359A-CountTakahashi有\(n\)个字符串,每个串要么是Takahashi要么是Aoki,问有多少个字符串是Takahashi额....这还要有题解吗(?)#include<iostream>#include<cstring>usingnamespacestd;intmain(){stringa;intn,ans=0;cin>......
  • Solution - Atcoder AGC010E Rearranging
    因为只有相邻的互质的\(a_i\)可以交换,那么就说明不互质的\(a_i\)无法相交换,对应的位置关系也就不会改变。于是可以考虑图论建模,对于\(\gcd(a_i,a_j)>1\),连边\((i,j)\)。那么对于先手,就相当于要把这些边定向,变为一个DAG。而后手因为要保证最大,所以肯定是在DAG上跑......
  • AtCoder Beginner Contest 359
    AtCoderBeginnerContest359这场我赛时打的非常不好,只做出了\(2\)题。A-CountTakahashi签到//Problem:A-CountTakahashi//Contest:AtCoder-UNIQUEVISIONProgrammingContest2024Summer(AtCoderBeginnerContest359)//URL:https://atcoder.jp/conte......
  • Solution - Atcoder AGC034F RNG and XOR
    考虑到这个边权是\(\oplus\),那么说明对于\((u,v)\),\(u\tov\)和\(v\tou\)的边权实质是相同的。那么对于\(0\tox\),就可以反过来,记录下对应的路径,从\(x\)开始走,那么第一次走到\(0\)的时候也就是从\(0\)第一次走到\(x\)的时候。于是就转化为了\(x\)为起点,第一次......