CF1332E Height All the Same 题解

CF1332E Height All the Same

考虑到可以在一个格子上码上两个方块,易得如果每个格子奇偶性相同,则一定可以到达同样高度。对于任意点对 (x,y),我们可以通过找到一条路,路径上可以互达的两点有一边相邻,xbcy,每次增加相邻两个点,这样除了 x,y 各自加 1,其余的点均加 2,奇偶性不变。

所以,我们每次可以改变两个点的奇偶性。对于 nm 为奇数的情况,我们一定可以找到一种奇偶性的数有偶数个,每次修改一对为另一种奇偶性。也就是说,对于任意一种初始情况,均可以修改至完全相同。数量为 (rl+1)nm

对于 nm 为偶数的情况,只有奇偶数个数均为偶数时才满足要求。考虑枚举奇数数量方案数累加,运用乘法原理求出每种情况的方案数。我们先选位置,如果现在有 i 个奇数,则有 Cnmi 种选法。设 [l,r]a 个奇数,b 个偶数,则奇数有 ai 种方法,偶数有 bnmi 种选法。

i=0,2inmCnmiaibnmi

看到这个式子,容易联想到二项式定理。但是这个式子不好转化,需要转化为对于每一个 i 都有一个计算式。我们考虑用整体减去部分,可是还是不行。顺着这个思路,可以想到利用 1 的幂构造摆动数列,当 i 为奇数时,(1)i 刚好为负数,表示减去奇数项;当 i 为偶数时,(1)i 为正数,尽管有重复计算,可是恰好答案中的每种情况算了两遍,最后除以 2 即可。

(rl+1)nmi=0nm(1)iCnmiaibnmi2

直接利用二项式定理进行转化,达到复杂度 O(log(nm))

(rl+1)nm(ba)nm2

#include <bits/stdc++.h>
using namespace std;
long long n,m,l,r,mod=998244353;
long long power(long long a,long long p)
{
	long long x=a,ans=1;
	while(p)
	   {
	   	if(p%2==1)ans=ans*x%mod;
	   	p/=2;
	   	x=x*x%mod;
	   }
	return ans;
}

int main()
{
	scanf("%lld%lld%lld%lld",&n,&m,&l,&r);
	if(n*m%2==1)printf("%lld",power(r-l+1,n*m));
	else 
	    {
	    	long long a=(r-l+1)/2,b=0;
	    	if((r-l+1)%2==1&&l%2==1)a++;
	    	b=r-l+1-a;
	    	printf("%lld",(power(r-l+1,n*m)+power((b-a+mod)%mod,n*m))%mod*499122177%mod);
		}
	return 0;
}
posted @   w9095  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示