首页 > 其他分享 >CF1942E Farm Game 题解

CF1942E Farm Game 题解

时间:2024-03-31 21:25:34浏览次数:29  
标签:空位 ifac Farm 题解 int Game fac John MOD

我们先默认第一头牛是 John 的,另一种情况本质相同,最后答案乘上 \(2\) 就可以了。

先说结论:我们将相邻两头牛配对,那么最终答案即满足至少一对牛间隔了奇数个空位的方案数。证明很简单,分 \(3\) 种情况讨论:

  1. 每对牛间都间隔了奇数个空位。那么 John 开始时让所有牛往右行动,在 Nhoj 行动后,John 只需要保证 Nhoj 行动的牛对应的 John 那头牛也行动,方向向右,这样就能保证轮到 John 时每队牛都间隔奇数个空位,并且不会出现游戏无法终止的情况。然后最后当每对牛都间隔为 \(0\) 时,轮到 Nhoj 行动,John 胜。
  2. 有些对牛间隔了奇数个空位,还有些隔了偶数个空位。那么 John 开始时选取所有奇数个空位的牛对里的牛行动,这样,如果 Nhoj 移动了奇数个空位的牛对里的牛,同第一种情况,如果移动了隔了偶数个空位牛对里的牛,John 不对对应的牛做任何操作,这样下一轮到他的时候就会变成第一种情况。
  3. 每对牛间都间隔了偶数个空位。John 先手必须行动,那么就会转化为上面的两种情况,Nhoj 必胜。

算答案我们考虑容斥,用总方案减去每对牛间都间隔了偶数个空位的方案,前者即为 \(\binom{l}{2n}\),后者枚举所有牛对间一共隔了 \(i\) 个空位,简单组合计数得到 \(\binom{l-i-n}{n}\binom{i/2+n-1}{n-1}\)。

#include<cstdio>
#include<algorithm>
#include<cmath>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long LL;
typedef pair<LL,int>pli;
const int N=2e6+10,MOD=998244353;
LL fac[N],ifac[N];
int qpow(int a,int b)
{
	int res=1;
	for(;b;b>>=1)
	{
		if(b&1)res=1ll*res*a%MOD;
		a=1ll*a*a%MOD;
	}
	return res;
}
void pw(int n)
{
	fac[0]=ifac[0]=1;rep(i,1,n)fac[i]=fac[i-1]*i%MOD;
	ifac[n]=qpow(fac[n],MOD-2);per(i,n-1,1)ifac[i]=ifac[i+1]*(i+1)%MOD;	
}
LL C(int n,int m){return n>=m?fac[n]*ifac[m]%MOD*ifac[n-m]%MOD:0;}
int n,k;
int main()
{
	int TOT;scanf("%d",&TOT);
	while(TOT--)
	{
		scanf("%d%d",&n,&k);
		pw(2*n+5);
		LL ans=C(n,k*2);
		for(int i=0;i<=n;i+=2)
		{
			LL val=C(n-i-k,k)*C(i/2+k-1,k-1)%MOD;
			(ans-=val)%=MOD;
		}
		(ans+=MOD)%=MOD;
		printf("%lld\n",ans*2%MOD);
	}
	return 0;
}


标签:空位,ifac,Farm,题解,int,Game,fac,John,MOD
From: https://www.cnblogs.com/onlycre/p/18107271

相关文章

  • [题解]P2516 [HAOI2010] 最长公共子序列——求LCS个数
    P2516[HAOI2010]最长公共子序列总的来说,这道题确实很精妙,难度也不小,耗费了不少时间去调。本来想过用容斥的思想,却因为当时理解不深没有继续思考就放弃了。学会了思路后对\(LCS\)有了更深层次的理解。题意简述给定\(A,B\)两个字符串(以.结尾),求它们的最长公共子序列的长度和个数......
  • 0324-0331题解反思
    最近我突然发现,写题解是常常会遗忘的,然而题目中的一些技巧才是永恒的,那么接下来的题解,我应该对以前的题目含有的这些技巧进行一些深刻的复盘。知识点模块1.当我们要实现一个图形的字符串的倒置,比如把福倒过来,我们可以进行以下的操作:先进行行的交换,在进行列的倒置,我们需要用到s......
  • 【C++实验1】学生成绩信息管理系统题解
    【问题描述】编写一个基于结构体得学生成绩信息管理系统。主要功能如下:1.用结构体存放所有数据。2.每个功能都用函数实现。3.输入10个学生的学号和三门课程的成绩。4.计算每个学生的总分。5.按总分从高到低排序。6.加上名次一列。7.输出最后的二维表格样式的成......
  • 题解 P9981 [USACO23DEC] Minimum Longest Trip G
    【洛谷专栏】题意\(N\)个点\(M\)条边的有向无环图,对于每一个点\(i\)你需要求出一条从\(i\)出发的最长路径且路径上边权组成的序列字典序最小。求每一条路径的长度和边权和。分析最长的路径很好求,在DAG上拓扑排序后动态规划即可。(具体的实现可以参考OI-Wiki)现在的......
  • Minlexes题解
    \(\texttt{ProblemLink}\)简要题意在一个字符串\(s\)中,对于每个后缀,任意删掉一些相邻的相同的字符,使得字符串字典序最小。注意:删掉之后拼起来再出现的相邻相同字符不能够删除。思路倍增好题。发现存在局部最优解(最优子结构),并且可以转移到其它结点,可以考虑使用dp。那就......
  • Tomcat启动失败,窗口一闪而过问题解决
    在启动Tomcat时窗口一闪而过,解决方法:在Tomcat安装目录\bin下启动cmd,或在C盘启动后跳转到Tomcat安装目录\bin,输入startup.bat(一定要先做这步,确保具体问题,再根据具体问题百度,不然又是配置JRE,又是配置Tomcat环境变量,最后做了无用功),如果显示如下:先确保java环境变量没问题,我的java......
  • 题解:AT_arc175_b [ARC175B] Parenthesis Arrangemen
    前言警示后人:字符串最大长度为\(65535\),会\(RE\)!!!\(10^7\)会爆栈!!!题意给出一个括号序列\(s\),有两种操作方式,交换两个字符需要花费\(A\),直接修改一个字符需要花费\(B\),求使这个序列合法需要的最小花费。分析我们可以先将\(s\)中能匹配的括号序列消除掉(即括号匹配......
  • [蓝桥杯] 管道 java题解
    importjava.util.*;/***管道*其实这道题核心根本不用管管道左边的如何,我们可以把左边当成注水口*/publicclassMain{staticintn;staticint[][]pipes;//阀门安排的地方staticintlen;//管道长度publicstaticvoidmain(String[]a......
  • AtCoder Beginner Contest 347 A-F 题解
    A-DivisibleQuesiton给你正整数\(N\)和\(K\),以及长度为\(N\)的序列\(A\)。提取\(A\)中所有是\(K\)倍数的元素,除以\(K\),并打印商。Solution判断\(A_i\%K\)的值是否为\(0\),如果非\(0\)则表示可以整除Code#include<bits/stdc++.h>usingnamespacest......
  • CCF-CSP真题《202309-3 梯度求解》题解
    题目string转longlong忘记处理负数卡了半天,服了#include<iostream>#include<cstdio>#include<cstring>#include<sstream>typedeflonglongll;usingnamespacestd;intn,m,temp;lla[302];stringf,x,b;llmod=1e9+7;structnode{ stringcon; n......