码迷,mamicode.com
首页 > 其他好文 > 详细

[CF1332E] Height All the Same - 组合数学

时间:2020-04-01 10:59:19      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:std   long   sig   ons   names   pre   its   const   signed   

对一个 \(n\times m\) 的矩阵,每个位置有权值 \(a_{ij}\),每次操作你可以将一个位置 \(+2\),或将四相邻的两个位置各 \(+1\)。如果一个矩阵经过若干次操作,可以使得所有位置权值相同,我们称它为好矩阵。问有多少个好矩阵满足大小为 \(n\times m\),且每个位置的权值都在 \([L,R]\) 内。

Solution

首先观察到,如果 \(nm\) 是奇数,一定合法;如果 \(nm\) 是偶数,则当且仅当 \(\sum_{(i,j)} a_{i,j}\) 是偶数时合法

\(nm\) 是奇数的方案数位 \((r-l+1)^{nm}\)

\(nm\) 是偶数时,若 \(r-l+1\) 是偶数,则所有方案中总和奇偶各占据一半,故 \((r-l+1)^{nm}/2\);若 \(r-l+1\) 是奇数,则显然总和为偶数的比总和为奇数的方案数多 \(1\),于是答案为 \(((r-l+1)^{nm}+1)/2\)

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int n,m,l,r,k;

int qpow(int p,int q) {
    return (q&1?p:1) * (q?qpow(p*p%mod,q/2):1) % mod;
}

signed main() {
    cin>>n>>m>>l>>r;
    k=r-l+1;
    if(n*m%2) cout<<qpow(k,n*m);
    else if(k&1) cout<<(qpow(k,n*m)+1)*((mod+1)/2)%mod;
    else cout<<(qpow(k,n*m))*((mod+1)/2)%mod;
}

[CF1332E] Height All the Same - 组合数学

标签:std   long   sig   ons   names   pre   its   const   signed   

原文地址:https://www.cnblogs.com/mollnn/p/12610680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!