题意

对于一个\(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. 如何借助Kafka持久化存储K8S事件数据?

    大家应该对 Kubernetes Events 并不陌生,特别是当你使用 kubectl describe 命令或 Event API 资源来了解集群中的故障时. $ kubectl get even ...

  2. centos linux系统安装详解

    打开vmware,版本差异区别不大 选择创建新的虚拟机 选择典型,是默认选项不用改,点击下一步 选择稍后安装操作系统(默认选项不用改),点击下一步 选择linux,并且版本改为centos 64位,点 ...

  3. odoo开发教程十六:定时任务

    一:定义定时器数据模型 模型中定义需要用到的字段.定时方法 from odoo import models, fields, api, exceptions import logging from d ...

  4. ODOO13之十四 :Odoo 13开发之部署和维护生产实例

    本文中将学习将 Odoo 服务器作为生产环境的基本准备.安装和维护服务器是一个复杂的话题,应该由专业人员完成.本文中所学习的不足以保证普通用户创建应对包含敏感数据和服务的健壮.安全环境. 本文旨在介绍 ...

  5. vue3实现H5网页录音并上传(mp3、wav)兼容Android、iOS和PC端

    使用 Recorder插件 可以在HTML5网页中进行录音,录音完成后得到blob文件对象,然后将blob上传到服务器:项目使用的vue3.0版本(这个插件同时支持vue2.0.也支持uniapp,很 ...

  6. Vue_Django 登录注册+图书管理系统

    Vue前端 注册页面 点击查看代码 <template> <div class="register"> <el-row :gutter="2 ...

  7. 【Rust-book】第五章 使用结构体来组织相关联的数据

    第五章 使用结构体来组织相关联的数据 结构,或者结构体,是一种自定义数据类型,它允许我们命名多个相关的值并将它们组成一个有机的结合体. 可以把结构体视作对象中的数据属性 1 对比元组和结构体之间的异同 ...

  8. rust随笔

    # 第二章 语言精要 ​ 好读书,不求甚解:每有会意,便欣然忘食. **动手,动手,动手!!!** ## 语句与表达式 Rust 中语法可以分成两大类:语句 statement 和表达式 expres ...

  9. 使用TensorFlow进行自动化测试与部署

    目录 标题:<使用 TensorFlow 进行自动化测试与部署> 背景介绍: 随着人工智能和机器学习技术的快速发展,TensorFlow 成为了一个广泛应用的深度学习框架,被广泛用于构建神 ...

  10. OOP第三阶段题目集总结|课程总结-22201608-柯汶君

      第三阶段的题目集时间跨度大,内容比较充实,对前面学习过的类的继承,多态,接口进行了巩固练习,加深我们对多态的理解,学会更好地改善代码的结构.同时对最后阶段所学习的集合框架体系(Set.Map等)比 ...