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)\)。汇总一下式子

\[\dfrac{(\sum c_i)!}{\prod c_i!}\times \dfrac{\prod a_i^{c_i}}{S^{\sum c_i}}\times \dfrac dS\times \dfrac{\prod a_i^{c_i}}{S^{\sum c_i}}\times \dfrac 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的更多相关文章

  1. @atcoder - AGC038E@ Gachapon

    目录 @description@ @solution - 1@ @accepted code - 1@ @solution - 2@ @accepted code - 2@ @details@ @de ...

  2. AtCoder Grand Contest 038E - Gachapon

    \(\bf Description\) 一个 \(0\) 到 \(n-1\) 的随机数生成器,生成 \(i\) 的概率是 \(A_i/S\) ,其中 \(S=\sum_{i=0}^{n} A_i\) ...

  3. Atcoder Grand Contest 038 E - Gachapon(Min-Max 容斥+背包)

    Atcoder 题面传送门 & 洛谷题面传送门 我竟然能独立做出 Ag 的 AGC E,incredible!更新了 Atcoder 做题难度上限( 首先按照套路 Min-Max 容斥,\(a ...

  4. SFC游戏列表(维基百科)

    SFC游戏列表 日文名 中文译名 英文版名 发行日期 发行商 スーパーマリオワールド 超级马里奥世界 Super Mario World 1990年11月21日 任天堂 エフゼロ F-Zero F-Z ...

  5. FC红白机游戏列表(维基百科)

    1055个fc游戏列表 日文名 中文译名 英文版名 发行日期 发行商 ドンキーコング 大金刚 Donkey Kong 1983年7月15日 任天堂 ドンキーコングJR. 大金刚Jr. Donkey K ...

  6. AtCoder Grand Contest 038 简要题解

    从这里开始 比赛目录 Problem A 01 Matrix Code #include <bits/stdc++.h> using namespace std; typedef bool ...

  7. AtCoder Grand Contest 038题解

    好久没更了 写点东西吧= = A 01Matrix 简单构造 左上角和右下角染成1其他染成0即可 #include<bits/stdc++.h> #define ll long long ...

  8. 咕咕咕清单(SCOI2020前)

    本篇博客已停更 本篇博客已停更 本篇博客已停更 吐槽区: 2020.04.15: 从今天起我做过的题目都记录一下,想不想写题解就另说了 2020.04.17: 写了两天之后真实的发现这是博主的摸鱼日记 ...

  9. AtCoder随做

    突然发现只有我没写过 AT. 没写题解不意味着没做,有的忘了写或者太草率了就算了. 部分前言删了. 目录 ABC020D ABC241G ABC268 AGC003D AGC004D AGC004E ...

随机推荐

  1. [信友队图灵杯中级组-D]基础循环结构练习题

    2023-5-13 题目 题目传送门 难度&重要性(1~10):6.5 题目来源 信友队图灵杯 题目算法 构造 解题思路 我们可以知道,在一开始我们得到的 \(a\) 数组是 \(1,2,3, ...

  2. 从头到尾说一次 Spring 事务管理(器)

    事务管理,一个被说烂的也被看烂的话题,还是八股文中的基础股之一.​ 本文会从设计角度,一步步的剖析 Spring 事务管理的设计思路(都会设计事务管理器了,还能玩不转?) 为什么需要事务管理? 先看看 ...

  3. 关于MySQL获取自增ID的几种方法

    1. Select Max(id) From Table; 通过取表字段最大值的方式来获取最近一次自增id 缺点: 这种方法在多人操作数据库的软件上不可靠, 举个例子, 你刚插入一条记录. 当你在查询 ...

  4. Excel单元格快速交换相邻位置内容

    一.相邻两列内容交换(A1与B1交换)1.首先选择A1单元格的边框位置,出现了向上下左右的十字标志 2.此时按住shift键,并且拖向B1单元格的右边,出现"工"汉字标志 3.松开 ...

  5. Solution -「CF 1303G」Sum of Prefix Sums

    Description Link. 对于一棵树,选出一条链 \((u,v)\),把链上结点从 \(u\) 到 \(v\) 放成一个 长度 \(l\) 的数组,使得 \(\sum_{i=1}^{l}\s ...

  6. proto转java类时相关option配置

    转载请注明出处: option java_multiple_files = true; 作用和意义:此选项指示生成的 Java 代码将被分割成多个文件而不是一个文件.每个消息类型都会生成一个单独的 J ...

  7. 一文给你讲清楚BeanFactory 和 FactoryBean 的关联与区别

    本文分享自华为云社区 <BeanFactory 和 FactoryBean 的关联与区别>,作者:战斧. 一.概括性的回答 两者其实都是Spring提供的接口,如下 public inte ...

  8. Modbus转profinet网关连接位移计在1200程序控制案例

    Modbus转profinet网关连接位移计在1200程序控制案例 本案例讲述了兴达易控Modbus转profinet网关(XD-MDPN100)连接现场用台达LD-E镭射位移计检测控制在1200PL ...

  9. 基于react18+vite4+arco.design搭建极简版后台管理模板

    趁着国庆前夕整了一个vite4结合react18搭建后台管理模板,搭配上字节团队react组件库ArcoDesign,整体操作功能非常丝滑.目前功能支持多种模板布局.暗黑/亮色模式.国际化.权限验证. ...

  10. .NET应用如何防止被反编译

    前言 前段时间分享了两篇关于.NET反编译相关的文章,然后文章留言区就有小伙伴提问:如何防止被反编译?因此本篇文章我们就来讲讲.NET应用如何防止被反编译..NET反编译相关的文章可以看如下文章: 4 ...