首页 > 其他分享 >csp模拟27-金箱子(题解)

csp模拟27-金箱子(题解)

时间:2024-08-22 17:04:54浏览次数:10  
标签:27 int 题解 ans 101 csp dp mod

题目链接(显然还没有找到原题)

虽说我现在才学会期望dp显得不太好,但没办法,谁让我比较菜~~,之前模拟赛已经考过几道类似的题了,但都一笔带过了,这次算是正式学习了一下这类题,于是就有了这篇题解。

首先看到k次方首先想到的就是我们在进行dp转移的时候不太方便,这个时候很自然的想到二项式定理去避免概率的重复计算,可以把k次冥的转移转换成for循环来做,这个时候就要去考虑转移方程了:设\(f[i]\)表示前i个宝箱的期望贡献,则显然有

\[f[i]^j=(f[i-1]+a[i])^j*p[i]+(f[i-1]+b[i])^j*(1-p[i]) \]

二项式定理展开即为:

\[f[i]^j=(\sum _{k=0}^{j} C _{j}^{k}f[i-1]^ka[i]^k)*p[i]+(\sum _{k=0}^{j} C _{j}^{k}f[i-1]^kb[i]^k)*(1-p[i]) \]

可以显然观察到两个式子不同的只有\((a[i]^k*p[i]/b[i]^k(1-p[i]))\),那么即可合并得:

\[f[i]^j=(\sum _{k=0}^{j} C _{j}^{k}f[i-1]^k(a[i]^k*p[i]+b[i]^k*(1-p[i]))) \]

此时dp转移中的\(f[i]^j\)并不是很好处理,考虑将dp数组多开一维,令\(f[i][j]\)表示\(f[i]\)在j次方下的取值并可以令\(op[i][j]=a[i]^j*p[i]+b[i]^j*(1-p[i])\),就可以很好的处理dp转移中的各种状态。
总时间复杂度为\(O(nk^2)\),压线通过此题。
最后附上代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e4+5,mod=998244353;
int n,m,l,r,a[N],b[N],op[N][101],p[N][2];
int x,y,z,t,k,ans,f[N][101],c[101][101];
int quickpow(int a,int b){
	int ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}return ans;
}
signed main(){
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>p[i][0]>>a[i]>>b[i];
		p[i][1]=(mod+1-p[i][0])%mod;
	}
	c[1][0]=c[1][1]=c[0][0]=1;
	for(int i=2;i<=k;i++){
		c[i][1]=i;c[i][0]=1;
		for(int j=2;j<=i;j++){
			c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=k;j++){
			op[i][j]=(quickpow(a[i],j)*p[i][0]%mod+quickpow(b[i],j)*p[i][1]%mod)%mod;
		}f[i][0]=1;op[i][0]=1;
	}
	for(int i=1;i<=k;i++)f[1][i]=op[1][i];
	for(int i=2;i<=n;i++){
		for(int j=1;j<=k;j++){
			for(int kk=0;kk<=j;kk++){
				f[i][j]=(f[i][j]+c[j][kk]*f[i-1][kk]%mod*op[i][j-kk]%mod)%mod;
			}
		}
	}cout<<f[n][k];
	return 0;
}

结束喽~~~~~

标签:27,int,题解,ans,101,csp,dp,mod
From: https://www.cnblogs.com/houburzyx/p/18374335

相关文章

  • 题解:P9041 [PA2021] Fiolki 2
    \(\text{Link}\)题意给定一个\(n\)个点\(m\)条边的DAG,定义\(f(l,r)\)表示最多选取多少条不相交路径\((s_i,t_i)\)满足\(s_i\in[1,k],t_i\in[l,r]\),其中不能有任意一点同时在两条选出的路径上。对\(\forallx\in[0,k)\)求出有多少\([l,r]\sube(k,n]\)使得\(f(l,r)......
  • 题解:P10881「KDOI-07」能量场
    \(\text{Link}\)题意给你一个长为\(n\)的序列\(a_{1\dotsn}\),定义一条边\((u,v)\)的权值为\(a_u+a_v\)。对于一张图,定义其权值为包含的所有边的权值乘积。求所有\(n\)个点的有标号基环树的权值之和。对\(998244353\)取模。\(n\le10^3\)。思路非常厉害的题,zky倾......
  • 题解:P10698 [SNCPC2024] 最大流
    \(\text{Link}\)题意给定一个\(n\)个点\(m\)条边的单位网络,保证该网络不存在环。给定一个常数\(k\),设从\(1\)到\(i\)的最大流为\(f_i\),对\(\foralli\in[2,n]\)求出\(\min(f_i,k)\)。\(n\le10^5\),\(m\le2\times10^5\),\(k\le\min(n-1,50)\)。思路不相交路径,考......
  • 升级Openssh 后 最大文件打开数修改不生效,启动 UsePAM yes后 ,最大文件打开数生效但是
    感谢 博主https://blog.csdn.net/Daphnisz/article/details/124040904vi /etc/pam.d/sshd(注意不是/etc/pam.d/sshd.pam)#%PAM-1.0auth required pam_sepermit.soauthsubstackpassword-authauthincludepostlogin#Usedwithpolkittoreauthor......
  • 常见问题解决 --- 为什么我们常常发现服务器没有管理的端口
    我们在扫描一台主机全端口,发现没有开放管理端口,比如windows远程桌面或者是linux的ssh登陆。我列举一下常见的原因。常规管理方式:1.管理口不是常见的3389和22端口,而改为了高位端口号,避免被人发现。2.在管理端口上加上了安全策略导致无法直接连接,比如私钥登陆方......
  • 题解:CF1986B Matrix Stabilization
    洛谷传送门题意一个\(n\timesm\)的矩阵,依次进行以下操作:从\((1,1)\)开始遍历矩阵,找到最小的\((i,j)\)满足\(a{i,j}\)的值严格大于其所有相邻(四联通)单元格的值,如果没有则退出将1操作找到的\(a_{i,j}-1\)返回1操作求最后的矩阵。思路模拟,我们按照题目所说,从......
  • 题解:P7020 [NWRRC2017] Boolean Satisfiability
    题目传送门题目大意给定一个由大小写字母(变量),|和~组成的布尔代数式,变量可以任意赋值为True或False。求对于给定的变量,有多少种赋值方案使得给定的代数式值为True。思路一个一个看,首先考虑|,先假设只有|,则当代数式中有一个变量为True时,代数式的值变为True。因为每一......
  • 暑假集训CSP提高模拟27
    暑假集训CSP提高模拟27组题人:@KafuuChinocpp\(T1\)P236.线性只因\(100pts\)诈骗题。部分分正解记\(opt\)表示待选集合,统计\(opt\)中这一位为\(1\)的数并加入临时集合\(tmp\)。若\(tmp\)大小\(\gem\)则加上这一位的贡献并将\(opt\)赋成\(tmp\)......
  • CSP防爆
    今日模拟赛T3把ac.inac.out愣是写成ac.txtac.txt自己在IDE里测大样例用的是.txt,提交没改过来100->0啊啊啊啊啊啊啊啊啊啊啊啊T6见祖宗0<=x<=1e9还要求和爆int但我没看见.....(100->90啊啊啊啊啊啊啊啊啊啊啊啊430->340经验考试绝不开多个页面,容易看错内存不紧......
  • 题解:P9788 [ROIR 2020 Day2] 区域规划
    题目传送门思路首先我们看下数据范围,$n<=3000$,范围很小,所以暴力枚举。于是第一份代码出来了。#include<bits/stdc++.h>usingnamespacestd;ints,a,b,c,d,n,m;intmain(){ ios::sync_with_stdio(false); cin.tie(),cout.tie(); cin>>n>>m; for(a=1;a<=n;a++) {......