题意

对于一个\(n*m\)的矩阵,有两种操作

  • 一个格子加二
  • 一个格子和另一个相邻的格子同时加一

通过这两种操作最终使得所有矩阵元素相等

对于矩阵元素来说,有\(L\leq a_{i,j}\leq R(1\leq i\leq n,1\leq j\leq m)\)

问有多少种方案数,答案\(\mod 998244353\)

分析

由于最终相等的值与答案无关,所以我们不妨所有元素减去\(L\),即所有元素的值在\([0,R-L]\)区间内

而所有元素通过操作可以相差最多为\(1\)(仅仅分奇偶)

这种操作可以不断进行,所以我们只需看数字的奇偶性

为描述,我们不妨将所有元素视为\(0,1\)

对于\(1\)来说,其周围一定没有\(1\),否则可以填上使两元素变为\(0\),那么如果该\(1\)和旁边的\(0\)同时加\(1\),我们可以发现\(0\)和\(1\)互换位置了

这种操作的意义在于,对于任意的一个\(1\),我们可以通过操作使其变到其他任意的位置

那么如果矩阵中有奇数个\(1\),我们可以将其变为\(1\)个\(1\),而偶数个\(1\),我们一定可以将两个\(1\)进行配对,从而消去

我们思考\(n*m\)的奇偶性

  • 若\(n*m\)为奇数,若有偶数个\(1\),则满足条件,若有奇数个\(1\),我们将其变为\(1\)个\(1\),并将其移动到边角上,通过蛇形配对,我们可以将除该元素的其他元素同时加上\(1\),所有元素相等,因此所有取值皆满足答案就是\((R-L+1)^{n*m}\)(每个数有\(R-L+1\)中取法)
  • 若\(n*m\)为偶数,若有偶数个\(1\),则满足条件,若有奇数个\(1\),我们可以发现元素和为奇数,而\(n*m\)为偶数,元素和无论怎么增加(每次加二),一定是奇数,无法整除\(n*m\)一定不满足,因此答案为偶数个\(1\)的取值方式

接下来分析\(n*m\)为偶数时,有多少种偶数个\(1\)的取值方式:

如果\(R-L+1\)为奇数,则可以取\(\frac {R-L+2} {2}\)种奇数,否则为\(\frac {R-L+1} {2}\)种奇数,设为\(j\),设\(R-L+1\)为\(t\)

答案为\(C^0_{n*m}*j^0*(t-j)^{n*m}+C^2_{n*m}*j^2*(t-j)^{n*m-2}+\cdots+C^{n*m}_{n*m}*j^{n*m}*(t-j)^{0}\),意思为挑偶数(\(2*k\))个奇数(\(C^{2*k}_{n*m}\)),每个奇数有\(j\)中取值,其余偶数有\(t-j\)种取值

发现这个式子是二项展开式的偶数项,那么可以推导下(半小时无从下手,我对不起高中数学老师)

\[(j+(t-j))^{n*m}=C^{0}_{n*m}j^{0}(t-j)^{n*m}+C^{1}_{n*m}j^{1}(t-j)^{n*m-1}+\cdots+C^{n*m}_{n*m}j^{n*m}(t-j)^{0}
\]
\[(j-(t-j))^{n*m}=C^{0}_{n*m}j^{0}(t-j)^{n*m}-C^{1}_{n*m}j^{1}(t-j)^{n*m-1}+\cdots+C^{n*m}_{n*m}j^{n*m}(t-j)^{0}
\]

第二个式子偶数项是加号,奇数项是减号(从\(0\)开始计数)

两式相加除以二即为偶数项和,即

\[\frac{(j+(t-j))^{n*m}+(j-(t-j))^{n*m}}{2}
\]
#pragma GCC optimize(3, "Ofast", "inline")

#include <bits/stdc++.h>

#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define int ll
#define ls st<<1
#define rs st<<1|1
#define pii pair<int,int>
#define rep(z, x, y) for(int z=x;z<=y;++z)
#define com bool operator<(const node &b)
using namespace std;
const int maxn = (ll) 3e5 + 5;
const int mod = 998244353;
const int inf = 0x3f3f3f3f; int qp(int x, int y) {
int ans = 1;
while (y) {
if (y & 1)
ans = ans * x % mod;
x = x * x % mod;
y >>= 1;
}
return ans;
} signed main() {
start;
int n, m, L, R;
cin >> n >> m >> L >> R;
int t = R - L + 1;
if ((n * m) & 1) {
cout << qp(t, n * m) % mod;
} else {
int j;
if (t & 1)
j = (t + 1) / 2;
else
j = t / 2;
int ans = ((qp(t, m * n) + qp((2 * j - t), m * n)) % mod + mod) % mod * qp(2, mod - 2) % mod;
cout << ans;
}
return 0;
}

CodeForces 1332E Height All the Same的更多相关文章

  1. [PyData] 03 - Data Representation

    Ref: http://blog.csdn.net/u013534498/article/details/51399035 如何在Python中实现这五类强大的概率分布 考虑下在mgrid上画二维概率 ...

  2. Educational Codeforces Round 97 (Rated for Div. 2) D. Minimal Height Tree (贪心)

    题意:有一个从根节点\(BFS\)得来的序列(每次\(bfs\)子节点的时候保证是升序放入队列的),现在让你还原树(没必要和之前相同),问能构造出的最小的树的深度. 题解:不看根节点,我们从第二个位置 ...

  3. CodeForces 548D 单调栈

    Mike and Feet Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Subm ...

  4. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  5. Codeforces Round #355 (Div. 2)-B

    B. Vanya and Food Processor 题目链接:http://codeforces.com/contest/677/problem/B Vanya smashes potato in ...

  6. Codeforces Round #355 (Div. 2)-A

    A. Vanya and Fence 题目连接:http://codeforces.com/contest/677/problem/A Vanya and his friends are walkin ...

  7. Codeforces Round #354 (Div. 2)-B

    B. Pyramid of Glasses 题目链接:http://codeforces.com/contest/676/problem/B Mary has just graduated from ...

  8. Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树

    C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...

  9. [codeforces 241]C. Mirror Box

    [codeforces 241]C. Mirror Box 试题描述 Mirror Box is a name of a popular game in the Iranian National Am ...

  10. CodeForces 471C MUH and House of Cards

    MUH and House of Cards Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & % ...

随机推荐

  1. Python从零到壹丨图像增强的顶帽运算和底帽运算

    摘要:这篇文章详细介绍了顶帽运算和底帽运算,它们将为后续的图像分割和图像识别提供有效支撑. 本文分享自华为云社区<[Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算>, ...

  2. 2014年蓝桥杯C/C++大学B组省赛真题(切面条)

    题目描述: 一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以得到3根面条. 如果连续对折2次,中间切一刀,可以得到5根面条. 那么,连续对折10次,中间切一刀,会得到多少 ...

  3. 企业研发效能度量利器,华为云发布CodeArts Board看板服务

    摘要:华为云CodeArts Board正式上线,欢迎体验. 本文分享自华为云社区<企业研发效能度量利器,华为云发布CodeArts Board看板服务>,作者:华为云头条. 数字化时代, ...

  4. 在vue 项目中嵌入jsp页面

    今日一个项目中一块功能模块是其他系统使用jsp已经开发好的页面,想着直接将其嵌入到当前的vue项目中节约开发成本:但是发现并非想象的那么简单 创建一个server.vue组件加载jsp页面 1 .第一 ...

  5. 现代 CSS 解决方案:CSS 原生支持的三角函数

    在 CSS 中,存在许多数学函数,这些函数能够通过简单的计算操作来生成某些属性值,例如 : calc():用于计算任意长度.百分比或数值型数据,并将其作为 CSS 属性值. min() 和 max() ...

  6. (亲测有效-专门解决Mac环境)Pycharm 解决无法打开的问题

    前提是Mac 安装了PyCharm.app 1.第一步:先输入: cd /Applications/PyCharm.app/Contents/MacOS 2.第二步:查看无法打开pycharm的原因, ...

  7. MySQL uuid及其相关的一些简单性能测试

    运维同事导入一批大约500万左右的数据,耗时较久.他使用的是纯SQL导入,主键使用的是UUID,因为业务原因没有使用自增ID. 因为是内网,不能远程访问. 通过沟通,大致觉得有两个原因,一是因为UUI ...

  8. Python Joblib库使用学习总结

    实践环境 python 3.6.2 Joblib 简介 Joblib是一组在Python中提供轻量级流水线的工具.特别是: 函数的透明磁盘缓存和延迟重新计算(记忆模式) 简单易用的并行计算 Jobli ...

  9. C++面试八股文:static_cast了解一下?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第20面: 面试官:C++中支持哪些类型转换? 二师兄:C++支持C风格的类型转换,并在C++11引入新的关键字规范了类型转换. 二师兄:C++11引 ...

  10. Winform或WebForm使用ReportViewer报表设计,工具栏按钮英文显示的解决办法

    在项目开发中,我们总是会用到rdlc报表设计器,大多数情况下在本地开发环境中工具栏按钮显示的是中文,但是部署到客户环境后发现显示的是英文. 解决这个问题也是走了很多弯路,给大家简单说一下: 1.最初以 ...