组合数学——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';
    }
} 

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/12623093.html