组合数学——cf1332E
/* 结论:可以同时改变任意两个块的奇偶性 所以如果n*m是奇数,那么初始状态无论如何设置都可以 n*m是偶数: 初始状态必须有偶数个偶数|偶数个奇数,求的时候用二项式反演一下即可 */ #include<bits/stdc++.h> using namespace std; #define ll long long #define mod 998244353 ll Pow(ll a,ll b){ ll res=1; while(b){ if(b%2)res=res*a%mod; b>>=1;a=a*a%mod; } return res; } int main(){ ll n,m,L,R; cin>>n>>m>>L>>R; if(n*m%2==0){ ll ans=0,odd,even; if(L%2==0){ odd=(R-L+1)/2; even=R-L+1-odd; }else { even=(R-L+1)/2; odd=R-L+1-even; } if(odd==0 || even==0)ans=1; else { ll sum=Pow(odd+even,n*m); ll dif=Pow(odd-even,n*m); ans=(sum+dif)*Pow(2,mod-2)%mod; } cout<<ans<<'\n'; }else { cout<<Pow(R-L+1,n*m)<<'\n'; } }