[XSY] 简单的博弈题(博弈+dp+组合数+容斥)

简单的博弈题
对于贪心的对手,显然用最大的一半和他最小的一半比较判断是否全胜。(这不就是田忌赛马吗)

对于随机的对手,先考虑暴力怎么做:

void check(int x,int w){if(x>m){res+=(w>=m/2+1);return;}for(int i=1;i<=m;i++){if(visb[i]) continue;visb[i]=1;if(xa[x]>b[i]) check(x+1,w+1);else check(x+1,w);visb[i]=0;}
}
void dfs(int x){if(x>m){res=0;check(1,0);ans=max(ans,res);return;}for(int i=1;i<=m;i++){if(visa[i]) continue;visa[i]=1;xa[x]=a[i];dfs(x+1);visa[i]=0;}
}
int main(){inv[0]=inv[1]=1;for(int i=2;i<N;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;for(int i=1;i<N;i++) inv[i]=1ll*inv[i-1]*inv[i]%mod;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%lld",&a[i]);while(n--){scanf("%d",&op);for(int i=1;i<=m;i++) scanf("%lld",&b[i]);ans=0;dfs(1);ans=ans*inv[m]%mod;printf("%lld\n",ans);}
}

由暴力中我们发现一件事:由于a[],b[]a[],b[]a[],b[]的配对情况固定,第一个人使用任何策略都不影响他获胜的概率\color{Red}第一个人使用任何策略都不影响他获胜的概率使
也就是说我们只需选一种自己数字的排列并固定下来,再去和对手的数字的m!m!m!种全排列匹配即可。

暴力枚举全排列显然是不可接受的,考虑从小到大考虑自己的每个数,用fi,jf_{i,j}fi,j表示考虑了前iii小的数,给其中jjj个匹配了比他小的数字的方案数

思考fi,jf_{i,j}fi,j的转移:
若给第iii个数匹配比他小的数字:
fi,j←fi−1,j−1×(p−(j−1))f_{i,j}\leftarrow f_{i-1,j-1}\times(p-(j-1))fi,jfi1,j1×(p(j1))
(其中ppp表示对手的数字中有ppp个小于a[i]a[i]a[i]
若给第iii个数匹配比他大的数字:
fi,j←fi−1,j×qf_{i,j}\leftarrow f_{i-1,j}\times qfi,jfi1,j×q
(其中qqq表示此时对手的数字中还剩qqq个比a[i]a[i]a[i]大的未匹配)

问题来了,要算出qqq,必须知道前i−1i-1i1个数具体匹配了对手的哪些数,那不就跟暴力一样了吗?

对此,我们的解决方法是
若不给第iii个数匹配比他小的数字,那么这个数先不匹配,即fi,j=fi−1,j+fi−1,j−1×(p−(j−1))f_{i,j}=f_{i-1,j}+f_{i-1,j-1}\times(p-(j-1))fi,j=fi1,j+fi1,j1×(p(j1))
在考虑完自己的所有数后,我们再给还没匹配的数统一匹配:
fm,j=fm,j×(m−j)!f_{m,j}=f_{m,j}\times(m-j)!fm,j=fm,j×(mj)!
但这样我们就不能保证所有数中恰好\color{Blue}恰好jjj个数匹配到了比他小的数,事实上,fm,j表示所有数中\color{Red}f_{m,j}表示所有数中fm,j至少\color{Blue}至少有j个数匹配到了比他小的数的方案数\color{Red}有j个数匹配到了比他小的数\space的方案数j 

根据广义容斥原理/二项式反演
g(k)g(k)g(k)表示所有数中恰好kkk个数匹配到了比他小的数 的方案数,
f(k)f(k)f(k)表示所有数中至少kkk个数匹配到了比他小的数 的方案数,
ans表示自己能赢的方案数ans表示自己能赢的方案数ans
∵f(k)=∑i=kmCikg(i)\because f(k)=\sum_{i=k}^{m}C_{i}^{k}g(i)f(k)=i=kmCikg(i) (因此ans≠f(⌊m+12⌋))\color{Red}(因此ans\not=f(\left\lfloor\frac{m+1}{2}\right\rfloor))ans=f(2m+1)
∴g(k)=∑i=km(−1)i−kCikf(i)\therefore g(k)=\sum_{i=k}^{m}(-1)^{i-k}C_{i}^{k}f(i)g(k)=i=km(1)ikCikf(i)

w=⌊m+12⌋w=\left\lfloor\frac{m+1}{2}\right\rfloorw=2m+1
ans=∑k=wmg(k)=∑k=wm∑i=km(−1)i−kCikf(i)=∑i=wmf(i)∑k=wi(−1)i−kCikans=\sum_{k=w}^{m}g(k)=\sum_{k=w}^{m}\sum_{i=k}^{m}(-1)^{i-k}C_{i}^{k}f(i)=\color{Red}\sum_{i=w}^{m}f(i)\sum_{k=w}^{i}(-1)^{i-k}C_{i}^{k}ans=k=wmg(k)=k=wmi=km(1)ikCikf(i)=i=wmf(i)k=wi(1)ikCik
事实上,优化到这里已经能AC了

但这个式子还可以再优化:
引理1:∑i=wn(−1)n−iCni=(−1)n−wCn−1w−1\color{Red}\sum_{i=w}^{n}(-1)^{n-i}C_{n}^{i}=(-1)^{n-w}C_{n-1}^{w-1}i=wn(1)niCni=(1)nwCn1w1
证明1:

引理2:Cni=Cn−1i−1+Cn−1iC_{n}^{i}=C_{n-1}^{i-1}+C_{n-1}^{i}Cni=Cn1i1+Cn1i
证明2:显然

由引理2,Cn−1i−1=Cni−Cn−1iC_{n-1}^{i-1}=C_{n}^{i}-C_{n-1}^{i}Cn1i1=CniCn1i
∵Cni+1=Cn−1i+Cn−1i+1\because C_{n}^{i+1}=C_{n-1}^{i}+C_{n-1}^{i+1}Cni+1=Cn1i+Cn1i+1
∴Cn−1i=Cni+1−Cn−1i+1\therefore C_{n-1}^{i}=C_{n}^{i+1}-C_{n-1}^{i+1}Cn1i=Cni+1Cn1i+1
∴Cn−1i−1=Cni−(Cni+1−Cn−1i+1)=Cni−Cni+1+Cn−1i+1\therefore C_{n-1}^{i-1}=C_{n}^{i}-(C_{n}^{i+1}-C_{n-1}^{i+1})=C_{n}^{i}-C_{n}^{i+1}+C_{n-1}^{i+1}Cn1i1=Cni(Cni+1Cn1i+1)=CniCni+1+Cn1i+1
pi−1=Cn−1i−1p_{i-1}=C_{n-1}^{i-1}pi1=Cn1i1,那么
pi−1=Cni−Cni+1+Cn−1i+1=Cni−Cni+1+pi+1p_{i-1}=C_{n}^{i}-C_{n}^{i+1}+C_{n-1}^{i+1}=C_{n}^{i}-C_{n}^{i+1}+p_{i+1}pi1=CniCni+1+Cn1i+1=CniCni+1+pi+1
∵pi+1=Cni+2−Cni+3+pi+3\because p_{i+1}=C_{n}^{i+2}-C_{n}^{i+3}+p_{i+3}pi+1=Cni+2Cni+3+pi+3
∴pi−1=Cni−Cni+1+Cni+2−Cni+3+pi+3=Cni−Cni+1+Cni+2−Cni+3+Cni+4−Cni+5+...Cnn\therefore p_{i-1}=C_{n}^{i}-C_{n}^{i+1}+C_{n}^{i+2}-C_{n}^{i+3}+p_{i+3}=C_{n}^{i}-C_{n}^{i+1}+C_{n}^{i+2}-C_{n}^{i+3}+C_{n}^{i+4}-C_{n}^{i+5}+...C_{n}^{n}pi1=CniCni+1+Cni+2Cni+3+pi+3=CniCni+1+Cni+2Cni+3+Cni+4Cni+5+...Cnn
∴∑i=wn(−1)n−iCni=(−1)n−wpw−1=(−1)n−wCn−1w−1\therefore \sum_{i=w}^{n}(-1)^{n-i}C_{n}^{i}=(-1)^{n-w}p_{w-1}=(-1)^{n-w}C_{n-1}^{w-1}i=wn(1)niCni=(1)nwpw1=(1)nwCn1w1
证毕

∴ans=∑i=wmf(i)∑k=wi(−1)i−kCik=∑i=wm(−1)i−wCi−1w−1f(i)\therefore ans=\sum_{i=w}^{m}f(i)\sum_{k=w}^{i}(-1)^{i-k}C_{i}^{k}=\sum_{i=w}^{m}(-1)^{i-w}C_{i-1}^{w-1}f(i)ans=i=wmf(i)k=wi(1)ikCik=i=wm(1)iwCi1w1f(i)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=10010;
const int mod=998244353;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int f[N],a[N],b[N],fac[N],inv[N];
int power(int a,int b){int res=1;while(b){if(b&1) res=1ll*res*a%mod;a=1ll*a*a%mod;b>>=1;}return res;
}
void init(int n){fac[0]=1;for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod;inv[n]=power(fac[n],mod-2);for(int i=n;i>=1;i--) inv[i-1]=1ll*inv[i]*i%mod;
}
int C(int n,int m){return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int n,m,op;
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++) a[i]=read();sort(a+1,a+m+1);init(m);while(n--){scanf("%d",&op);for(int i=1;i<=m;i++) b[i]=read();sort(b+1,b+m+1);if(op==1){int ans=1;for(int i=1;i<=(m+1)/2;i++){if(b[i]>a[i+(m-1)/2]){ans=0;break;}}printf("%d\n",ans);} else{memset(f,0,sizeof(f));f[0]=1;for(int i=1;i<=m;i++){int p=lower_bound(b+1,b+m+1,a[i])-b-1;for(int j=p;j>=1;j--)f[j]=(f[j]+1ll*f[j-1]*(p-(j-1)))%mod;}for(int i=1;i<=m;i++)f[i]=1ll*f[i]*fac[m-i]%mod;int ans=0,tag=0;for(int i=(m+1)/2;i<=m;i++){int sum=1ll*C(i-1,(m-1)/2)*f[i]%mod;if(tag) sum=mod-sum;ans=(ans+sum)%mod;tag^=1;}ans=1ll*ans*inv[m]%mod;printf("%lld\n",ans);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【矩阵乘法】沼泽鳄鱼(ssl 2511)

沼泽鳄鱼 ssl 2511 题目大意 给你一个无向图&#xff0c;有一些鳄鱼有周期性地在这个图中走&#xff08;鳄鱼不用沿着边走&#xff0c;周期为2或3或4&#xff09;&#xff0c;问你从初始点走到最终点走k个单位时间&#xff0c;不在点和边上停下&#xff0c;不在同一时间和鳄…

Matrix(二维hash)

题目链接 文章目录题目描述题意&#xff1a;题解代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 给定一个M行N列的01矩阵&#xff08;只包含数字0或1的矩阵&am…

当我们谈高性能时,我们谈些什么?(送书活动)

网站越快&#xff0c;用户的黏性就越高&#xff1b;网站越快&#xff0c;用户忠诚度更高&#xff1b;网站越快&#xff0c;用户转化率越高。简言之&#xff0c;速度是关键。——《Web 性能权威指南》显然&#xff0c;高性能意味着“快”。但对快的定义&#xff0c;在不同的系统…

P5355-[Ynoi2017]由乃的玉米田【莫队,bitset,根号分治】

正题 题目链接:https://www.luogu.com.cn/problem/P5355 顺带一提的是P3674 小清新人渣的本愿是这题的弱化版&#xff0c;提交就可以A 题目大意 nnn个数字&#xff0c;询问 一个区间是否有两个数a,ba,ba,b使得abxabxabx一个区间是否有两个数a,ba,ba,b使得a−bxa-bxa−bx一个区…

[XSY] 字符串题(字符串,构造)

字符串题 考虑找到一种方法&#xff0c;能够对一个 lyndon 串 A &#xff0c;直接求出 A 的下一个 lyndon 串。考虑不断复制 A &#xff0c;得 AAA…A因为 lyndon 串是自身循环移位得到的串中字典序严格最小的&#xff0c;所以 AAA…A 非lyndon 串。考虑微调&#xff1a;将 AA…

【DP】划分数列(ybtoj DP-2-1)

划分数列 ybtoj DP-2-1 题目大意 给你一个数列&#xff0c;让你划分出最少的段数&#xff0c;使每段要么单调不降&#xff0c;要么单调不增 输入样例#1 6 1 2 3 2 2 1 输出样例#1 2 输入样例#2 9 1 2 1 2 1 2 1 2 1 输出样例#2 5 输入样例#3 7 1 2 3 2 1 99999999…

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

什么是Generic Host ?这是在Asp.Net Core 2.1加入了一种新的Host&#xff0c;现在2.1版本的Asp.Net Core中&#xff0c;有了两种可用的Host。Web Host –适用于托管Web程序的Host,就是我们所熟悉的在Asp.Net Core应用程序的Mai函数中用CreateWebHostBuilder创建出来的常用的We…

牛客网【每日一题】5月19日题目精讲 比赛

链接&#xff1a; 文章目录题目描述题意题解&#xff1a;代码时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 你在打比赛&#xff0c;这场比赛总共有12个题 对于第i个题&…

P3704-[SDOI2017]数字表格【莫比乌斯反演】

正题 题目链接:https://www.luogu.com.cn/problem/P3704 题目大意 TTT组询问&#xff0c;给出n,mn,mn,m求∏i1n∏j1mFbigcd(i,j)\prod_{i1}^n\prod_{j1}^mFbi_{gcd(i,j)}i1∏n​j1∏m​Fbigcd(i,j)​ 其中FbixFbi_xFbix​表示第xxx项斐波那契数列。 解题思路 答案就是∏x1nFb…

【贪心】奶牛晒衣服(ybtoj 贪心-1-1)

奶牛晒衣服 ybtoj 贪心-1-1 题目大意 有n件衣服&#xff0c;每件衣服有一个湿度&#xff0c;每一个单位时间所有衣服会湿度-a&#xff0c;同时可以选择一件衣服使其湿度-b&#xff0c;问最短在多久可以使所有衣服湿度小于等于0 输入样例 3 2 1 1 2 3输出样例 1数据范围 1…

[XSY] 树与图(树形DP、生成函数、分治NTT、重链剖分)

树与图 如果真的在图上跑算法&#xff0c;那么光建图复杂度就O(n2logn)O(n^2logn)O(n2logn)了&#xff0c;这显然不可行。所以一定要把 在图上的操作 转换成 在树上的操作 在图上删去点u&#xff0c;相当于在树上删去u到根节点的链&#xff0c;并把u的整棵子树删掉 如果我们枚举…

520 钻石争霸赛 题解

说好的钻石难度&#xff0c;结果本人菜的一地。。只有88分。。。。 文章目录7-1 考试周7-2 真的恭喜你7-3 平均成绩7-4 古风AB难度开始上升7-5 猜近似数字7-6 随机输一次7-7 阶乘的非零尾数7-8 三足鼎立前四题十分钟AC后两题二十分钟自闭第五题玄学卡点不知为何7-1 考试周 模拟…

.NET Core 跨平台物联网框架 ServerSuperIO.Core,一套设备驱动通吃嵌入式、上位机、云服务...

一、概述我们的大数据平台&#xff08;云&#xff09;平台的数据接收服务基于ServerSuperIO开发&#xff0c;因为集成的功能比较多&#xff0c;无法实现跨平台&#xff0c;现在跑在Windows下。但是云端体系化、标准化建设&#xff0c;跨平台是必走的技术路线。在ServerSuperIO基…

P3243-[HNOI2015]菜肴制作【拓扑排序,优先队列】

正题 题目链接:https://www.luogu.com.cn/problem/P3243 题目大意 nnn个数&#xff0c;有mmm个要求形如xxx在yyy的前面&#xff0c;现在要求在i−1i-1i−1尽量靠前的情况下iii尽量靠前(i>1)(i>1)(i>1) 求这个序列 解题思路 这个很显然要求是张有向图无环图&#xff…

【贪心】雷达装置(ybtoj 贪心-1-2)

雷达装置 ybtoj 贪心-1-2 题目大意 在平面直角坐标系中有n个点&#xff0c;现在让你在x轴上布置雷达&#xff0c;雷达可以的侦查半径为d&#xff0c;问你最少布置多少个雷达 输入样例 3 2 1 2 -3 1 2 1输出样例 2数据范围 1⩽n⩽1031\leqslant n \leqslant 10^31⩽n⩽103…

[XSY] 传统游戏(DP、容斥)

传统游戏 看到题&#xff0c;第一想法是设dp[k][s]dp[k][s]dp[k][s]表示选了kkk个数&#xff0c;当前异或和为sss的方案数&#xff0c;但这样产生一个问题&#xff1a;要如何保证所选的数不重复且无序呢&#xff1f;一种方法是修改状态&#xff1a;我们增设一维iii&#xff0c…

asp.net core添加全局异常处理及log4net、Nlog应用

一、介绍此篇文章将会介绍项目的全局异常收集以及采用log4net或者NLog记录。众所周知&#xff0c;一旦自己的项目报错&#xff0c;如果没有进行处理都是显示不友好的&#xff0c;有得甚至直接爆出错误页面&#xff0c;看的也是很奇怪。为了避免出现这样的错误以及在错误出现的时…

牛客网 【每日一题】5月20日题目 简单瞎搞题

比赛链接 文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 输入描述: 第一行一个数 n。 然后 n 行&#xff0c;每行两个数表示 li,ri。 输出描述: 输出一行一个数表示答案。 示例1 输入 5 1 2 2 3 3 4 4 5 5 6输出 26备注: 1 ≤ n , li , ri ≤ 100 题解&#xf…

P6688-可重集【字符串hash,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P6688 解题思路 nnn个数&#xff0c;每次有操作 修改一个数询问两个区间是否他们中的元素分别组成的可重集合A,BA,BA,B&#xff0c;满足对于每个AiBikA_iB_ikAi​Bi​k其中kkk是一个相同的数 解题思路 先不考虑kkk的问题 我…

【贪心】畜栏预定(ybtoj 贪心-1-3)

畜栏预定 ybtoj 贪心-1-3 题目大意 有n头牛&#xff0c;每头牛会在某一连续时间段吃草&#xff0c;问你同一时间最对有多少头牛&#xff0c;最后对于每一头牛给一个吃草的位置&#xff0c;使得同一时间内吃草的牛的位置不重合 输入样例 5 1 10 2 4 3 6 5 8 4 7输出样例 4…