Codeforces 1332E Height All the Same [ 紫 ] [ 组合数学 ] [ 二项式定理 ]
Height All the Same:小清新二项式定理题。话说这玩意真的有紫吗,不管是推式子部分还是观察部分都比较显然吧,感觉可以蓝。
转化
首先看到每次进行
观察
那么操作
也就是说,我们要消除
消除该如何做呢?显然是将两个本来不挨在一起的两个
但到底要消除
当 为奇数时
显然填什么数都合法,因为奇数要拆分成奇数和偶数,而
当 为偶数时
这时候就不是填啥都合法了,因为
假设
那么这时候的答案是
观察到式子只对偶数项求和,并且还有组合数,很容易想到用二项式来加速计算。所以我们考虑对所有项求和,然后把奇数项乘一个
这个结果式子就是
那么我们现在就可以用二项式定理来化简了,最后的结果是:
快速幂计算即可,时间复杂度
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
const ll mod=998244353;
ll n,m,l,r;
ll qpow(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1)res=(res*a)%mod;
b>>=1;
a=(a*a)%mod;
}
return res;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>l>>r;
ll odd=(r+1)/2-(l-1+1)/2,even=r/2-(l-1)/2;
if((1ll*n*m)&1)cout<<qpow(r-l+1,1ll*n*m);
else cout<<(qpow(even-odd,1ll*n*m)+qpow(even+odd,1ll*n*m))%mod*qpow(2,mod-2)%mod;
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战