CF1332E Height All the Same 题解
考虑到可以在一个格子上码上两个方块,易得如果每个格子奇偶性相同,则一定可以到达同样高度。对于任意点对 ,我们可以通过找到一条路,路径上可以互达的两点有一边相邻,,每次增加相邻两个点,这样除了 各自加 ,其余的点均加 ,奇偶性不变。
所以,我们每次可以改变两个点的奇偶性。对于 为奇数的情况,我们一定可以找到一种奇偶性的数有偶数个,每次修改一对为另一种奇偶性。也就是说,对于任意一种初始情况,均可以修改至完全相同。数量为 。
对于 为偶数的情况,只有奇偶数个数均为偶数时才满足要求。考虑枚举奇数数量方案数累加,运用乘法原理求出每种情况的方案数。我们先选位置,如果现在有 个奇数,则有 种选法。设 有 个奇数, 个偶数,则奇数有 种方法,偶数有 种选法。
看到这个式子,容易联想到二项式定理。但是这个式子不好转化,需要转化为对于每一个 都有一个计算式。我们考虑用整体减去部分,可是还是不行。顺着这个思路,可以想到利用 的幂构造摆动数列,当 为奇数时, 刚好为负数,表示减去奇数项;当 为偶数时, 为正数,尽管有重复计算,可是恰好答案中的每种情况算了两遍,最后除以 即可。
直接利用二项式定理进行转化,达到复杂度 。
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探