首先复习快速幂

#include<bits/stdc++.h>
using namespace std;
long long power(long long a,long long b,long long k)
{
long long ans=,base=a;
while (b>)
{
if(b&)
{
ans*=base;
ans%=k;
}
base*=base;
base%=k;
b>>=;
}
return ans;
}
int main()
{
long long b,p,k;
cin>>b>>p>>k;
cout<<b<<'^'<<p<<" mod "<<k<<"="<<(power(b,p,k) % k);
return ;
}

我居然不DEFINE LL?可以看到上面的码十分好懂

那么矩阵快速幂也是一样的 只不过把*换成了mul函数



用计算机模拟矩阵乘法是这样的

struct mat{
long long m[][];//这里不开ll会死人
};
mat mul(mat x,mat y){
mat r;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
r.m[i][j] = ;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
for(int k=;k<=n;k++){
r.m[i][j] += (x.m[i][k] * y.m[k][j]) % p;
r.m[i][j] %= p;
}
}
}
return r;
}

首先定义一个矩阵并赋初值0 然后模拟乘的过程

什么?你想看矩阵乘法的公式?我不会MARKDOWN啊百度麻烦您了

还有一个小问题 就是在矩阵乘法中 什么矩阵是“1"?

答案就是(1,1)(2,2)(3,3).....(N,N)=1 其他地方为0的矩阵(可以自己手动模拟一下)

好了上完整代码

#include<bits/stdc++.h>
#define ll long long
#define p 1000000007 using namespace std; struct mat{
long long m[][];
}e,ans1,ans2; ll k,n; mat mul(mat x,mat y){
mat r;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
r.m[i][j] = ;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
for(int k=;k<=n;k++){
r.m[i][j] += (x.m[i][k] * y.m[k][j]) % p;
r.m[i][j] %= p;
}
}
}
return r;
} mat pow(mat x,ll y){
mat ans = e;
while (y>){
if(y&){
ans = mul(ans,x);
}
x=mul(x,x);
y>>=;
}
return ans;
} int main(){
cin>>n>>k;
for(int i=;i<=n;i++) e.m[i][i] = ;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
scanf("%d",&ans1.m[i][j]);
}
}
ans2 =pow (ans1,k);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
printf("%d ",ans2.m[i][j]);
}
cout<<endl;
}
return ;
}

你会了这个才会矩阵加速之类乱七八糟的东西

TAG:SIN_XIII ⑨

【数论】 快速幂&&矩阵快速幂的更多相关文章

  1. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  2. 快速幂 & 矩阵快速幂

    目录 快速幂 实数快速幂 矩阵快速幂 快速幂 实数快速幂 普通求幂的方法为 O(n) .在一些要求比较严格的题目上很有可能会超时.所以下面来介绍一下快速幂. 快速幂的思想其实是将数分解,即a^b可以分 ...

  3. jiulianhuan 快速幂--矩阵快速幂

    题目信息: 1471: Jiulianhuan 时间限制: 1 Sec  内存限制: 128 MB 提交: 95  解决: 22 题目描述 For each data set in the input ...

  4. 整数快速乘法/快速幂+矩阵快速幂+Strassen算法

    快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c  二.矩 ...

  5. 快速幂&&矩阵快速幂

    快速幂 题目链接:https://www.luogu.org/problemnew/show/P1226 快速幂用了二分的思想,即将\(a^{b}\)的指数b不断分解成二进制的形式,然后相乘累加起来, ...

  6. [板子]快速幂&矩阵快速幂

    不会的来这看:https://www.cnblogs.com/CXCXCXC/p/4641812.html 简单的一说:当转换为二进制的时候有位运算这种黑科技,&相当于%2判断奇偶性. x&a ...

  7. hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...

  8. 矩阵快速幂模板(pascal)

    洛谷P3390 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格 ...

  9. 培训补坑(day10:双指针扫描+矩阵快速幂)

    这是一个神奇的课题,其实我觉得用一个词来形容这个算法挺合适的:暴力. 是啊,就是循环+暴力.没什么难的... 先来看一道裸题. 那么对于这道题,显然我们的暴力算法就是枚举区间的左右端点,然后通过前缀和 ...

随机推荐

  1. python的对象 变量

    对象 所有的数据类型都是对象 字符串 数字:整数.数字 列表.字典 函数.类.模块.方法 print(type(20)) # 查看对象的数据类型 python整型: int  浮点型 :float 精 ...

  2. python画手绘图

    第一步:插入代码 #e17.1HandDrawPic.py from PIL import Image import numpy as np vec_el = np.pi/2.2 # 光源的俯视角度, ...

  3. 编译原理---antlr实践+编译过程理解+课程理解知识点

    0.其他说明 0.0编译器分为前.中.后端,课上主要学的是前端.前端又分为词法分析(lexical analysis).语法分析(syntax analysis).语义分析(semantic anal ...

  4. es2018(es9)前瞻

    命名捕获 语法 : ?<name> 一:举个栗子 我们要把从2018-05-20取出年月日 1:普通方法 let str = '2018-05-20'; let reg1 = /(\d{4 ...

  5. 论使用HashMap优化双层For循环的实际性能

    当需要对两个集合进行相互操作的时候,一般需要进行双层For循环,但我们知道双层For在数量越大的时候性能影响越大 这时候我们会想到的其中一种解决方法就是利用Hashmap在查找数据的高效上来优化双层F ...

  6. mtd-utils交叉编译安装

    一.获取源码并解压 存储于/home/zhangyi/work/psoc_ltp/tools-ltp-ddt中,解压后的源码存于上一层目录. 1.mtd-utils-2.0.0 wget ftp:// ...

  7. Job for network.service failed because the control process exited with error code

    转自:https://blog.csdn.net/dongfei2033/article/details/81124465 今天在centOS 7下更改完静态ip后发现network服务重启不了,翻遍 ...

  8. Python中 sys.argv[]的用法简明解释

    sys.argv[]就是一个从程序外部获取参数的桥梁,这个“外部”很关键.因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能 ...

  9. redis哨兵集群配置

    redis 集群架构图: 需要先配置redis主从,我这边是单机部署的. 采用一主一从,两个sentinel. redis host: 172.31.11.235 redis-master port: ...

  10. 回车\r与换行\n

    在计算机出现之前,有一种电传机械打字机,每秒可以打10个字符.但是有一个问题,就是打满一行后,需要进行换行,换行是需要0.2秒.如果这时有字符传入,就会丢失两个字符.为了解决这个问题,便定义了两个字符 ...