[AGC038E] Gachapon
Problem Statement
Snuke found a random number generator.
It generates an integer between $0$ and $N-1$ (inclusive).
An integer sequence $A_0, A_1, \cdots, A_{N-1}$ represents the probability that each of these integers is generated. The integer $i$ ($0 \leq i \leq N-1$) is generated with probability $A_i / S$, where $S = \sum_{i=0}^{N-1} A_i$. The process of generating an integer is done independently each time the generator is executed.
Now, Snuke will repeatedly generate an integer with this generator until the following condition is satisfied:
- For every $i$ ($0 \leq i \leq N-1$), the integer $i$ has been generated at least $B_i$ times so far.
Find the expected number of times Snuke will generate an integer, and print it modulo $998244353$.
More formally, represent the expected number of generations as an irreducible fraction $P/Q$. Then, there exists a unique integer $R$ such that $R \times Q \equiv P \pmod{998244353},\ 0 \leq R < 998244353$, so print this $R$.
From the constraints of this problem, we can prove that the expected number of generations is a finite rational number, and its integer representation modulo $998244353$ can be defined.
Constraints
- $1 \leq N \leq 400$
- $1 \leq A_i$
- $\sum_{i=0}^{N-1} A_i \leq 400$
- $1 \leq B_i$
- $\sum_{i=0}^{N-1} B_i \leq 400$
- All values in input are integers.
Input
Input is given from Standard Input in the following format:
- $N$
- $A_0$ $B_0$
- $A_1$ $B_1$
- $\vdots$
- $A_{N-1}$ $B_{N-1}$
Output
Print the expected number of times Snuke will generate an integer, modulo $998244353$.
Sample Input 1
- 2
- 1 1
- 1 1
Sample Output 1
- 3
The expected number of times Snuke will generate an integer is $3$.
Sample Input 2
- 3
- 1 3
- 2 2
- 3 1
Sample Output 2
- 971485877
The expected number of times Snuke will generate an integer is $132929/7200$.
Sample Input 3
- 15
- 29 3
- 78 69
- 19 15
- 82 14
- 9 120
- 14 51
- 3 7
- 6 14
- 28 4
- 13 12
- 1 5
- 32 30
- 49 24
- 35 23
- 2 9
Sample Output 3
- 371626143
要求最晚的一个被填满的时间,是很难求的。考虑min-max反演,把他转变为求第一个被填到的时间。
现在要求每一个集合的第一个被填到 \(b_i\) 的时间,枚举这个是那个点,然后我们就知道这个序列中最后一个被填的是哪一个(设为给 d加了1)。那其他点呢?我们需要结束时这个点的状态,把他设为 \(c_i\),那么对于一个固定的 \(c\),在选的顺序上有 \(\frac{(\sum c_i)!}{\prod c_i!}\) 种,刚好会选出这些数的概率是 \(\tfrac{\prod a_i^{c_i}}{S^{\sum c_i}}\),最后刚好选到 d 的概率是 \(\frac dS\)。这些都是集合内的概率,而期望下在 \(\frac S{\sum a_i}\) 会抽到一次集合内的数,则再乘一个 \(\frac S{\sum a_i}(\sum c+1)\)。汇总一下式子
\]
到这里就可以dp了,定义 \(dp_{i,j,k,0/1,0/1}\) 为集合中前 \(i\) 个数,c之和为 j,a之和为k,容斥系数和是否选出d
对于某一个集合,我们需要dp才能解决,那么对于所有的集合,我们也可以通过dp来解决,只不过多了一种不选入集合的情况
虽然枚举加 dp 是四维的,但是 \(\sum b\le 400\),所以总共也是 \(n^3\)
#include<bits/stdc++.h>
using namespace std;
const int N=405,P=998244353;
int n,a[N],b[N],f[N],iv[N],dp[N][N][2][2],sa,sb,inv[N],ans;
int pown(int x,int y)
{
if(!y)
return 1;
int t=pown(x,y>>1);
if(y&1)
return 1LL*t*t%P*x%P;
return 1LL*t*t%P;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",a+i,b+i);
for(int i=inv[1]=iv[0]=f[0]=1;i<=400;i++)
{
f[i]=1LL*f[i-1]*i%P;
if(i^1)
inv[i]=1LL*(P-P/i)*inv[P%i]%P;
iv[i]=1LL*iv[i-1]*inv[i]%P;
}
dp[0][0][0][0]=1;
for(int i=1;i<=n;i++)
{
sa+=a[i];
sb+=b[i];
for(int j=sa;j>=a[i];j--)
{
for(int k=sb;k>=0;k--)
{
long long pw=1,lp;
for(int c=0;c<b[i]&&c<=k;c++,pw=1LL*pw*a[i]%P)
{
lp=pw;
(dp[j][k][0][0]+=dp[j-a[i]][k-c][1][0]*pw%P*iv[c]%P)%=P;
(dp[j][k][1][0]+=dp[j-a[i]][k-c][0][0]*pw%P*iv[c]%P)%=P;
(dp[j][k][1][1]+=dp[j-a[i]][k-c][0][1]*pw%P*iv[c]%P)%=P;
(dp[j][k][0][1]+=dp[j-a[i]][k-c][1][1]*pw%P*iv[c]%P)%=P;
}
if(k>=b[i]-1)
{
(dp[j][k][0][1]+=pw*dp[j-a[i]][k-b[i]+1][1][0]%P*iv[b[i]-1]%P)%=P;
(dp[j][k][1][1]+=pw*dp[j-a[i]][k-b[i]+1][0][0]%P*iv[b[i]-1]%P)%=P;
}
}
}
}
for(int i=0;i<=sa;i++)
{
for(int j=0;j<=sb;j++){
(ans+=1LL*(P-1)*dp[i][j][0][1]%P*(j+1)%P*inv[i]%P*f[j]%P*inv[i]%P*pown(pown(i,j),P-2)%P)%=P;
(ans+=1LL*dp[i][j][1][1]*(j+1)%P*inv[i]%P*f[j]%P*inv[i]%P*pown(pown(i,j),P-2)%P)%=P;
}
}
printf("%lld\n",ans*1LL*sa%P);
}
[AGC038E] Gachapon的更多相关文章
- @atcoder - AGC038E@ Gachapon
目录 @description@ @solution - 1@ @accepted code - 1@ @solution - 2@ @accepted code - 2@ @details@ @de ...
- AtCoder Grand Contest 038E - Gachapon
\(\bf Description\) 一个 \(0\) 到 \(n-1\) 的随机数生成器,生成 \(i\) 的概率是 \(A_i/S\) ,其中 \(S=\sum_{i=0}^{n} A_i\) ...
- Atcoder Grand Contest 038 E - Gachapon(Min-Max 容斥+背包)
Atcoder 题面传送门 & 洛谷题面传送门 我竟然能独立做出 Ag 的 AGC E,incredible!更新了 Atcoder 做题难度上限( 首先按照套路 Min-Max 容斥,\(a ...
- SFC游戏列表(维基百科)
SFC游戏列表 日文名 中文译名 英文版名 发行日期 发行商 スーパーマリオワールド 超级马里奥世界 Super Mario World 1990年11月21日 任天堂 エフゼロ F-Zero F-Z ...
- FC红白机游戏列表(维基百科)
1055个fc游戏列表 日文名 中文译名 英文版名 发行日期 发行商 ドンキーコング 大金刚 Donkey Kong 1983年7月15日 任天堂 ドンキーコングJR. 大金刚Jr. Donkey K ...
- AtCoder Grand Contest 038 简要题解
从这里开始 比赛目录 Problem A 01 Matrix Code #include <bits/stdc++.h> using namespace std; typedef bool ...
- AtCoder Grand Contest 038题解
好久没更了 写点东西吧= = A 01Matrix 简单构造 左上角和右下角染成1其他染成0即可 #include<bits/stdc++.h> #define ll long long ...
- 咕咕咕清单(SCOI2020前)
本篇博客已停更 本篇博客已停更 本篇博客已停更 吐槽区: 2020.04.15: 从今天起我做过的题目都记录一下,想不想写题解就另说了 2020.04.17: 写了两天之后真实的发现这是博主的摸鱼日记 ...
- AtCoder随做
突然发现只有我没写过 AT. 没写题解不意味着没做,有的忘了写或者太草率了就算了. 部分前言删了. 目录 ABC020D ABC241G ABC268 AGC003D AGC004D AGC004E ...
随机推荐
- 大规模 IoT 边缘容器集群管理的几种架构-6-个人体验及推荐
前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介 大规模 IoT 边缘容器集群管理的几种架构-1-Rancher+K3s 大规模 IoT 边缘容器集群管理的几种架构-2-H ...
- 算术逻辑单元的实现(ALU)
一.实验目的 掌握Vivado集成开发环境 掌握Verilog语言基本知识. 掌握并理解算术逻辑单元ALU的原理和设计 二.实验预习 1.ALU(算术逻辑单元)的16种运算的编码 三.模块接口设计 A ...
- 使用GPU搭建支持玛雅(Maya)和Adobe AI,DW,PS的职校云计算机房
背景 学校为职业学校,计算机教室需要进行Maya.Adobe Illustrator.Adobe Dreamweaver.Adobe PhotoShop等软件的教学.每个教室为35用户.资源需求为4核 ...
- Unity 游戏开发、02 基础篇 | 知识补充、简单使用动画、动画状态机
前置笔记(由浅入深) Unity 游戏开发.01 基础篇 2 场景操作 3D场景 Q 手型工具(鼠标中键):上下左右移动场景 ALT + 鼠标左键:以视图为中心旋转 鼠标右键:以观察者为中心旋转 SH ...
- Fetch设置超时请求
promise + fetch + AbortController + setTimeOut 这是一段正常的fetch请求 fetch('www.baidu.com',{}) .then(res=&g ...
- Solution -「洛谷 P4688」「YunoOI 2016」掉进兔子洞
Description (Link)[https://www.luogu.com.cn/problem/P4688]. 每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的 ...
- golang Context应用举例
Context本质 golang标准库里Context实际上是一个接口(即一种编程规范. 一种约定). type Context interface { Deadline() (deadline ti ...
- SQL运用full join连接,decode函数,nvl函数进行列转行
背景说明:full join连接,decode函数,nvl函数,结合生产背景理解更深刻: test_A表是现金业主某时间段的收益:test_B表是非现金业主某时间段的收益:对于业主,test_A表与t ...
- android开发阶段性技能
一.初级 1. 拥有娴熟的Java基础,理解设计模式,比如OOP语言的工厂模式要懂得. 2. 掌握Android UI控件.Android Java层API相关使用. 迈向中级,最好再次更新下Java ...
- 【RocketMQ】RocketMQ存储结构设计
CommitLog 生产者向Broker发送的消息,会以顺序写的方式,写入CommitLog文件,CommitLog文件的根目录由配置参数storePathRootDir决定,默认每一个CommitL ...