首页 > 其他分享 >构造矩阵

构造矩阵

时间:2023-10-30 09:01:24浏览次数:38  
标签:long int 矩阵 ret times qmi 构造 mod

构造矩阵

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

构造出的矩阵需满足:

  • 每一行上的所有元素之积均等于 $k$。
  • 每一列上的所有元素之积均等于 $k$。

保证 $k$ 为 $1$ 或 $-1$。

请你计算,一共可以构成出多少种不同的满足条件的矩阵。

由于结果可能很大,你只需要输出对 $10^9+7$ 取模后的结果。

输入格式

共一行,包含三个整数 $n,m,k$。

输出格式

一个整数,表示对 $10^9+7$ 取模后的结果。

数据范围

前 $3$ 个测试点满足 $1 \le n,m \le 3$。
所有测试点满足 $1 \le n,m \le 10^{18}$,$k$ 为 $1$ 或 $-1$。

输入样例1:

1 1 -1

输出样例1:

1

输入样例2:

1 3 1

输出样例2:

1

输入样例3:

3 3 -1

输出样例3:

16

 

解题思路

  首先由于只能填整数且乘积不是 $1$ 就是 $-1$,因此只能填 $1$ 或 $-1$。对于一个 $n \times m$ 的矩阵,先把最后一行和最后一列空出来,那么剩余的部分的大小就是 $(n-1) \times (m-1)$,有 $2^{(n-1) \times (m-1)}$ 种填法。填完后对于前 $n-1$行中的第 $r$ 行,由于每一行的乘积是 $k$,因此最后一列的 $(r,m)$ 这个位置填的数字就唯一确定了,即 $\frac{k}{\prod\limits_{i=1}^{m-1}{a_{r,i}}}$。同理由于每一列的乘积是 $k$,因此最后一行的前 $m-1$ 列也是唯一确定的。

  最后对于 $(n,m)$ 这个位置的元素,既要满足第 $n$ 行的乘积是 $k$,也要满足第 $m$ 列的乘积是 $k$。假设 $(n-1) \times (m-1)$ 大小的矩阵的乘积是 $c$,最后一行的前 $m-1$ 列的乘积是 $a$,最后一列的前 $n-1$ 行的乘积是 $b$,那么我们会得到 $a \cdot c = 2^{n-1}$,$b \cdot c = 2^{m-1}$。如果 $(n,m)$ 存在解,那么应该有 $a = b$,即 $2^{n-1} = 2^{m-1}$。分情况讨论,如果 $k=1$,那么等式必然成立。否则 $k=-1$,那么 $n$ 与 $m$ 的奇偶性相同等式才能成立。因此无解的条件是 $k=-1$ 且 $n$ 和 $m$ 的奇偶性不同。

  接下来就是计算 $2^{(n-1) \times (m-1)}$,很明显 $(n-1) \times (m-1)$ 会爆 long long,因此可以用 __int128。另外一个做法是写成 $\left( 2^{n-1} \right)^{m-1}$,求两次快速幂即可。还有一种做法是用费马小定理。因为有 $a^{p-1} \equiv 1 \pmod{p}$,其中 $p$ 是质数,$\operatorname{gcd}(a,p)=1$,因此有 $2^{(n-1) \times (m-1)} \equiv 2^{(n-1) \times (m-1) \mod p-1} \pmod{p}$。

  AC 代码如下:

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

const int mod = 1e9 + 7;

int qmi(int a, __int128 k) {
    int ret = 1;
    while (k) {
        if (k & 1) ret = 1ll * ret * a % mod;
        a = 1ll * a * a % mod;
        k >>= 1;
    }
    return ret;
}

int main() {
    LL n, m;
    int k;
    scanf("%lld %lld %d", &n, &m, &k);
    if (k == -1 && (n - 1) % 2 != (m - 1) % 2) printf("0");
    else printf("%d", qmi(2, (__int128)(n - 1) * (m - 1)));
    
    return 0;
}
#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

const int mod = 1e9 + 7;

int qmi(int a, LL k) {
    int ret = 1;
    while (k) {
        if (k & 1) ret = 1ll * ret * a % mod;
        a = 1ll * a * a % mod;
        k >>= 1;
    }
    return ret;
}

int main() {
    LL n, m;
    int k;
    scanf("%lld %lld %d", &n, &m, &k);
    if (k == -1 && (n - 1) % 2 != (m - 1) % 2) printf("0");
    else printf("%d", qmi(qmi(2, n - 1), m - 1));
    
    return 0;
}
#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

const int mod = 1e9 + 7;

int qmi(int a, int k) {
    int ret = 1;
    while (k) {
        if (k & 1) ret = 1ll * ret * a % mod;
        a = 1ll * a * a % mod;
        k >>= 1;
    }
    return ret;
}

int main() {
    LL n, m;
    int k;
    scanf("%lld %lld %d", &n, &m, &k);
    if (k == -1 && (n - 1) % 2 != (m - 1) % 2) printf("0");
    else printf("%d", qmi(2, (n - 1) % (mod - 1) * ((m - 1) % (mod - 1)) % (mod - 1)));
    
    return 0;
}

 

参考资料

  AcWing 5284. 构造矩阵(AcWing杯 - 周赛):https://www.acwing.com/video/5188/

标签:long,int,矩阵,ret,times,qmi,构造,mod
From: https://www.cnblogs.com/onlyblues/p/17797009.html

相关文章

  • 为什么大模型计算的时候只会利用KVcache来存放KV矩阵,Q矩阵每次不一样?
    大型神经网络计算中使用KVCache(Key-Value缓存)的概念主要涉及于注意力机制(self-attentionmechanism),通常用于Transformer架构中。KVCache的目的是为了减少计算复杂性,提高效率,并节省计算资源。这涉及到Transformer的推理(inference)阶段,而不是训练(training)阶段。在Transformer中,自注......
  • JavaScript ES6 类的继承和构造函数图
        https://www.bilibili.com/video/BV15S4y1N7Mu?p=13&vd_source=f47173c6ece362dfbe9a439ae6addcce   ......
  • 【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )
    文章目录一、继承+组合模式的类对象构造函数和析构函数调用规则1、场景说明2、调用规则二、完整代码示例分析1、代码分析2、代码示例一、继承+组合模式的类对象构造函数和析构函数调用规则1、场景说明如果一个类既继承了基类,又在类中维护了一个其它类型的成员......
  • Java 静态代码块、代码块、构造方法和多态继承的代码执行顺序
    测试代码importlombok.Getter;publicclassExecutionOrder{{System.out.println("ExecutionOrdercode0");}static{System.out.println("ExecutionOrderstaticcode");}{System.out.println(&......
  • Acwing127周赛第三题 构造矩阵 (套路)
    题目链接:构造矩阵题目描述我们希望构造一个n×m的整数矩阵。构造出的矩阵需满足:每一行上的所有元素之积均等于k。每一列上的所有元素之积均等于k。保证k为1或−1。请你计算,一共可以构成出多少种不同的满足条件的矩阵。由于结果可能很大,你只需要输出对109+7......
  • Spring为什么建议构造器注入?看看和你所理解的一样吗?
    Spring框架鼓励使用构造器注入的主要原因是出于设计原则和最佳实践的考虑,这有助于提高代码的可维护性、可测试性和整体质量。以下是详细说明为什么Spring建议构造器注入以及相关实例代码:1.易于测试构造器注入使得对类的单元测试变得更加容易。通过将依赖项作为构造函数的参数传递,......
  • 刷题笔记——矩阵(C)
    85.最大矩形-力扣(LeetCode)给定一个仅包含 0 和 1 、大小为 rowsxcols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。解题思路依次遍历矩阵的每一行,计算每列落在的该行的”1“的个数,那么,本题就转换成了”柱状图的最大面积“。代码实现intlargestRectangleAr......
  • 2023-10-28:用go语言,给定一个n*m的二维矩阵,每个位置都是字符, U、D、L、R表示传送带的位
    2023-10-28:用go语言,给定一个n*m的二维矩阵,每个位置都是字符,U、D、L、R表示传送带的位置,会被传送到:上、下、左、右,.、O分别表示空地、目标,一定只有一个目标点,可以在空地上选择上、下、左、右四个方向的一个,到达传送带的点会被强制移动到其指向的下一个位置。如果越界直接结束,返......
  • 2023-10-28:用go语言,给定一个n*m的二维矩阵,每个位置都是字符, U、D、L、R表示传送带的位
    2023-10-28:用go语言,给定一个n*m的二维矩阵,每个位置都是字符,U、D、L、R表示传送带的位置,会被传送到:上、下、左、右,.、O分别表示空地、目标,一定只有一个目标点,可以在空地上选择上、下、左、右四个方向的一个,到达传送带的点会被强制移动到其指向的下一个位置。如果越界直接......
  • 系统集成易混淆知识点汇总-职能型、矩阵型、项目型组织结构
    概念:(1)职能型:职能型组织结构是按职能来组织部门分工,即从企业高层到基层,均把承担相同职能的管理业务及其人员组合在一起,设置相应的管理部门和管理职务。(2)矩阵型:矩阵型组织结构是把按职能划分的部门和按产品(或项目、服务等)划分的部门结合起来组成一个矩阵,使同一个员工既同原职能部......