首页 > 其他分享 >AT_agc038_e [AGC038E] Gachapon 题解

AT_agc038_e [AGC038E] Gachapon 题解

时间:2024-04-10 20:35:12浏览次数:27  
标签:md 题解 rep times agc038 Gachapon ans sum dp

比较基础的一道题。很容易想到 Min-Max 容斥:

\[E(\max(S))=\sum_{T\sube S}(-1)^{|T|-1}\times E(\min(T)) \]

然后发现 \(E(\min(T))=\sum_{k\ge 0}P(\min(T)\ge k)\)。考虑 dp,记 \(f_{i,j,k}\) 表示从前 \(i\) 个数中选出 \(T\),\(\sum_{i\in T}A_i=j,\sum_{i\in T}c_i=k\) 且每个数都还没被选过 \(B_i\) 次,到达这个状态的概率(\(c_i\) 表示第 \(i\) 个数选了多少次)。发现每次选出一个数的概率不好直接求得,可以先乘上对应的 \(A\) 值最后再除以一个东西。

转移时直接枚举当前数 \(i\) 选了 \(x\) 个,\(f_{i-1,j-a_i,k-x}\) 乘上系数 \({k\choose x}\times A_i^x\) 求和即可。

最后再考虑一个状态 \(f_{n,i,j}\) 对答案的贡献是什么。发现每次都有 \(\frac{S-i}S\) 的概率选中集合外的一个数,所以对于每一步的贡献还要加上 \(\frac{S-i}i\)。那么每一步的贡献就是 \(\frac S i\),所以最终答案就是 \(\sum S\times i^{j+1}\times f_{n,i,j}\)。时间复杂度 \(\mathcal O(\sum A_i(\sum B_i)^2)\)。

参考代码:

#include<bits/stdc++.h>
#define ll long long
#define md 998244353
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rept(i,a,b) for(int i=a;i<b;++i)
using namespace std;
int n,s1,s2,a[403],b[403],c[403][403];
ll ans,p[403][403],dp[403][403][403];
ll power(ll x,int y){
	ll ans=1;
	for(;y;y>>=1){
		if(y&1)ans=ans*x%md;
		x=x*x%md;
	}
	return ans;
}
signed main(){
	cin>>n;
	rep(i,1,n)cin>>a[i]>>b[i];
	c[0][0]=1;
	rep(i,1,400){
		p[i][0]=c[i][0]=1;
		rep(j,1,401){
			p[i][j]=p[i][j-1]*i%md;
			c[i][j]=(c[i-1][j-1]+c[i-1][j])%md;
		}
	}
	dp[0][0][0]=-1;
	rep(i,1,n){
		s1+=a[i],s2+=b[i]-1;
		rep(j,0,s1){
			rep(k,0,s2){
				dp[i][j][k]=dp[i-1][j][k];
				if(j>=a[i])rep(x,0,min(k,b[i]-1)){
					dp[i][j][k]=(dp[i][j][k]-dp[i-1][j-a[i]][k-x]*p[a[i]][x]%md*c[k][x])%md;
				} 
			}
		}
	}
	rep(i,1,s1)rep(j,0,s2){
		ans=(ans+s1*dp[n][i][j]%md*power(p[i][j+1],md-2))%md;
	}
	cout<<(ans+md)%md;
	return 0;
}

标签:md,题解,rep,times,agc038,Gachapon,ans,sum,dp
From: https://www.cnblogs.com/zifanoi/p/18127340

相关文章

  • MHY1001. [崩三]椰子树题解
    #include<bits/stdc++.h>usingnamespacestd;constintN=1010,M=20010;intq[M];//s的最大值为20000,v的最小值为1,所以队列里面最多是会有200010个元素的intn,m;intf[M],g[M];intmain(){cin>>n>>m;for(inti=1;i<=n;++i){......
  • CF1804C Pull Your Luck 题解
    题面。翻译清晰,这里就不吐槽了。根据轮盘转动的方法,可以看出这是一个简单的高斯求和。因为这是一个轮盘,在轮盘中转动了\(now\)个格子与转动了\(now\bmodn\)所到达的格子是一样的(这就没必要证明了吧),因此我们很容易就能得到一个最朴素的代码: cin>>T; while(T--) { c......
  • P3891 [GDOI2014] 采集资源 题解
    题面。看到大家都是两个动态规划的写法,来给大家讲一下只用一次动态规划的写法。思路设\(f_{i,j}\)表示工作效率为\(i\),获取\(j\)点资源所需的最短时间,不以苦工设状态是因为苦工会因为后面购买而改变,不太现实。\(tme\)表示答案,即到达\(t\)点资源所需的最短时间。从\(0......
  • P8661 [蓝桥杯 2018 省 B] 日志统计 题解
    好久没写题解了,水一篇。这里主要想讲的是不同的处理方法,在阅读本篇题解前请确保读完题。详解一,排序这很好理解,题目要求将热帖从小到大输出,同时题目中还有相对的时间这一概念,因此将输入的\(id\)与\(ts\)按照优先\(id\)其次\(ts\)的排序方式从小到大,排序,这样输出时就没......
  • CF133B Unary 题解
    题面。在考虑如何优化程序时,不要忽略了这题的纯暴力做法。对于样例2此处样例2的输入应该是++++[>,.<-],也许是翻译问题,但并不重要。思路依据题意,将输入的字符串\(s\)转为其对应的二进制串\(str\),在暴力将\(str\)由二进制转为十进制即可。代码为了防止因为幂运算而......
  • CF1913C Game with Multiset 题解
    翻译初始时你有一个空序列,共\(m\)次操作,每次操作读入两个数\(t_i\),\(v_i\),分为以下两种操作:当\(t_i=1\)时,在空序列中加入\(2^{v_i}\)这一元素。(此时\(0\lev_i\le29\))当\(t_i=2\)时,询问是否存在:取当前序列的某些元素,使它们的的和等于\(v_i\)(此时\(0\lev_i\l......
  • CF1913B Swap and Delete 题解
    翻译给定一个字符串\(s\),你有两种操作:删除一个字符。(花费一枚金币)交换某两个字符的位置。(不花费金币)假设经过若干次操作后得到的字符串为\(t\)。\(t\)是好的当且仅当对于任意的\(i\)(\(1\lei\le|t|\),\(|t|\)为字符串\(t\)的长度),均满足\(t_i\nes_i\)。(\(s\)是......
  • CF1907B YetnotherrokenKeoard 题解
    比较简单,建议评橙。题面。思路对于每个给定的字符串,用两个大根堆来分别记录小写字母与大写字母,注意这里记录时不要记录大写的B和小写的b。每当出现一个B时,从记录大写字母的大根堆中取出目前最后录入的大写字母的位置,标记,接着弹出堆顶元素,标记。小写字母同理。以上操作在......
  • CF1891B Deja Vu 题解
    建议凭橙,思路橙,码量红到橙。题面。思路一,暴力直接依照题意模拟,复杂度\(O(tqn^2)\),看一眼数据范围,妥妥T飞,倒在第三个点。二,逐步优化看一眼数据发现,虽然\(q\)很大,但实际上\(x\)只有三十个值,因此首先预处理出从\(2^1\)到\(2^{30}\)的所有值,摘掉一个\(n\),复杂度\(O......
  • P9750 [CSP-J 2023] 一元二次方程 题解
    题面。直接依照题意模拟即可,注意细节。细节第一注意输出分式时分母为\(1\)不输出,分子为\(0\)直接输出零且不带正负号。第二约分时,\(gcd\)内的两个数应该都是非负实数。第三可以单独输出符号,注意别有多余的符号。第四当方程有两根且均是有理数时,要根据\(2a\)的正......