题目链接:构造矩阵

题目描述

我们希望构造一个 n×m 的整数矩阵。

构造出的矩阵需满足:

每一行上的所有元素之积均等于 k。
每一列上的所有元素之积均等于 k。
保证 k 为 1 或 −1。 请你计算,一共可以构成出多少种不同的满足条件的矩阵。 由于结果可能很大,你只需要输出对 109+7 取模后的结果。 输入格式
共一行,包含三个整数 n,m,k。 输出格式
一个整数,表示对 109+7 取模后的结果。 数据范围
前 3 个测试点满足 1≤n,m≤3。
所有测试点满足 1≤n,m≤1018,k 为 1 或 −1。 难度:困难
时/空限制:1s / 256MB
总通过数:300
总尝试数:1360
来源:AcWing,第127场周赛
算法标签

样例

输入样例1:
1 1 -1
输出样例1:
1
输入样例2:
1 3 1
输出样例2:
1
输入样例3:
3 3 -1
输出样例3:
16

算法1

(两次快速幂) \(O(log(n-1*m-1))\)

套路:

把最下面一行和最右边一列拿出来,只考虑左上角这个n-1*m-1的小矩形的取法,这个小矩形每个方格可以取1或者-1,

一共2^(n-1)(m-1)种不同的取法,而对于每一行,只要确定了前m-1个,最后一个就确定了,对于每一列,只要确定了前n-1列,最后一个也确定了。

但是要注意,最右下角这个点,可能会无法确定

A B C 表示的是那个区域的乘积

看最后一行,由于每一行的乘积都是k,所以xA=k,所以x=k/A

看最右边一列,由于每一列的乘积都是k,所以x
B=k,所以x=k/B

那么x如果想要确定,就必须得是 k/A=k/B,也就是A要等于B

而A,B都是有左上角的矩形确定的,

AC 是m-1列的乘积,每一列成绩是k,那么AC=k^(m-1)

BC 是n-1行的乘积,每一行成绩是k,那么BC=k^(n-1)

所以,A=k^(m-1) /C, B=k^(n-1)/C

想要让A=B,对于k=1,一定成立,对于k=-1,需要m-1和n-1奇偶性相同,否则不成立

而成立的情况,答案就是左上角的小矩形的填法,也就是2^(n-1)(m-1)种不同的取法,由于指数很大,所以可以做两次快速幂,或者用欧拉函数:因为我们知道 a^(p-1) 同余1modp,a与p互质,p为质数,所以我们可以把指数mod (p-1)

C++ 代码

#include<iostream>
using namespace std;
const int mod=10e9+7;
typedef long long LL; LL qmi(LL a,LL k,LL p)
{
long long res=1; while(k)
{
if(k&1)
{
res=res*a%p;
}
k>>=1;
a=a*a%p;
} return res;
}
int main()
{
long long n,m,k;
cin>>n>>m>>k; if(n==1||m==1)
{
cout<<1<<endl; return 0;
}
LL p = qmi(2, n - 1, mod);
if((n + m) & 1) cout << 0;
else cout << qmi(p, m - 1, mod); return 0;
}

算法2

(欧拉函数) \(O(log(n-1*m-1))\)

C++ 代码

#include<iostream>
using namespace std;
const int mod=1e9+7;
typedef long long LL; LL qmi(LL a,LL k,LL p)
{
long long res=1; while(k)
{
if(k&1)
{
res=res*a%p;
}
k>>=1;
a=a*a%p;
} return res;
}
int main()
{
LL n, m, k;
cin >> n >> m >> k; if (k == -1 && n % 2 != m % 2) puts("0");
else
{
LL t = (n - 1) % (mod - 1) * ((m - 1) % (mod - 1)) % (mod - 1);
cout << qmi(2, t, mod) << endl;
} return 0;
}

Acwing127周赛第三题 构造矩阵 (套路)的更多相关文章

  1. NOIP2014-普及组复赛-第三题-螺旋矩阵

    题目描述 Description 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵 ...

  2. LeetCode 56,57,60,连刷三题不费劲

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第34篇文章,刚好接下来的题目比较简单,很多和之前的做法类似.所以我们今天出一个合集,一口气做完接下来的57.5 ...

  3. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  4. NOIP2008提高组(前三题) -SilverN

    此处为前三题,第四题将单独发布 火柴棒等式 题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0 ...

  5. 阿里聚安全攻防挑战赛第三题Android PwnMe解题思路

    阿里聚安全攻防挑战赛第三题Android PwnMe解题思路 大家在聚安全挑战赛正式赛第三题中,遇到android app 远程控制的题目.我们今天带你一探究竟,如何攻破这道题目. 一.题目 购物应用 ...

  6. Number Sequence(HDU 1005 构造矩阵 )

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  7. NOIP2005-普及组复赛-第三题-采药

    题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山 ...

  8. [数学-构造矩阵]NEFU 1113

    依据题意.我已经推导出tn的公式.ti=ti.a+ti.b,ti.a=5*t(i-1).a+4*t(i-1).b,ti.b=t(i-1).a+t(i-1).b 然而以下居然不能继续推到sn的公式!!! ...

  9. poj 3735 Training little cats(构造矩阵)

    http://poj.org/problem?id=3735 大致题意: 有n仅仅猫,開始时每仅仅猫有花生0颗,现有一组操作,由以下三个中的k个操作组成: 1. g i 给i仅仅猫一颗花生米 2. e ...

  10. HDU 3306 Another kind of Fibonacci ---构造矩阵***

    Another kind of Fibonacci Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

随机推荐

  1. PTA 21级数据结构与算法实验8—排序

    目录 7-1 统计工龄 7-2 寻找大富翁 7-3 点赞狂魔 7-4 插入排序还是归并排序 7-5 插入排序还是堆排序 7-6 逆序对 7-7 堆排序 7-8 石子合并 7-9 第k小 7-10 快速 ...

  2. Cilium 系列-3-Cilium 的基本组件和重要概念

    系列文章 Cilium 系列文章 前言 安装完了,我们看看 Cilium 有哪些组件和重要概念. Cilium 组件 如上所述,安装 Cilium 时,会安装几个运行组件(有些是可选组件), 它们各是 ...

  3. 【WebGL系列-04】清除缓冲区并绘制图形

    清除缓冲区并绘制图形 前文中已经准备好了webgl程序和绘制所用的数据,但是在绘制图像之前,还要对画布进行处理. 清除缓冲区 由于图像的绘制是一帧一帧绘制,每一帧针对当前的状态,计算屏幕上每个像素的颜 ...

  4. java.sql.SQLException: ORA-28040: 没有匹配的验证协议

    一直以来用的都是服务器上的Oracle数据库,今天改成连接本地Oracle 12c数据库是出问题了.hibernate连接Oracle12c时出现 java.sql.SQLException: ORA ...

  5. spring多数据源动态切换的实现原理及读写分离的应用

    简介 AbstractRoutingDataSource是Spring框架中的一个抽象类,可以实现多数据源的动态切换和路由,以满足复杂的业务需求和提高系统的性能.可扩展性.灵活性. 应用场景 多租户支 ...

  6. JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践

    前言 自 2014 年发布以来, JDK 8 一直都是相当热门的 JDK 版本.其原因就是对底层数据结构.JVM 性能以及开发体验做了重大升级,得到了开发人员的认可.但距离 JDK 8 发布已经过去了 ...

  7. [Pwn之路]根据所给库,获得远程同环境——使用patchelf的正确姿势

    原文:https://www.freebuf.com/sectool/366854.html 存自己这里方便看. 0x00 前言 如何修改本地pwn文件和题目所给环境一致,从而进行调试,这是从学习堆开 ...

  8. 代替forever下一个部署node的持久化工具---pm2

    最近有个后端项目,用的是node,在持久化的时候会挂掉,详细了解到用的是nohup,然后先详细了解了一下nohup nohup是一个Linux命令,用于在系统后台不挂断地运行命令,退出终端不会影响程序 ...

  9. 为何每个开发者都在谈论Go?

    本文深入探讨了Go语言的多个关键方面,从其简洁的语法.强大的并发支持到出色的性能优势,进一步解析了Go在云原生领域的显著应用和广泛的跨平台支持.文章结构严谨,逐一分析了Go语言在现代软件开发中所占据的 ...

  10. 原来你是这样的JAVA[05]--String

    1.从概念上讲,java字符串就是Unicode字符串. 2.字符串拼接 用指定分隔符拼接字符串数组时,使用StringJoiner或者String.join()更方便: 用StringJoiner拼 ...