【数论】 快速幂&&矩阵快速幂
首先复习快速幂
#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 ⑨
【数论】 快速幂&&矩阵快速幂的更多相关文章
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- 快速幂 & 矩阵快速幂
目录 快速幂 实数快速幂 矩阵快速幂 快速幂 实数快速幂 普通求幂的方法为 O(n) .在一些要求比较严格的题目上很有可能会超时.所以下面来介绍一下快速幂. 快速幂的思想其实是将数分解,即a^b可以分 ...
- jiulianhuan 快速幂--矩阵快速幂
题目信息: 1471: Jiulianhuan 时间限制: 1 Sec 内存限制: 128 MB 提交: 95 解决: 22 题目描述 For each data set in the input ...
- 整数快速乘法/快速幂+矩阵快速幂+Strassen算法
快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c 二.矩 ...
- 快速幂&&矩阵快速幂
快速幂 题目链接:https://www.luogu.org/problemnew/show/P1226 快速幂用了二分的思想,即将\(a^{b}\)的指数b不断分解成二进制的形式,然后相乘累加起来, ...
- [板子]快速幂&矩阵快速幂
不会的来这看:https://www.cnblogs.com/CXCXCXC/p/4641812.html 简单的一说:当转换为二进制的时候有位运算这种黑科技,&相当于%2判断奇偶性. x&a ...
- hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...
- 矩阵快速幂模板(pascal)
洛谷P3390 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格 ...
- 培训补坑(day10:双指针扫描+矩阵快速幂)
这是一个神奇的课题,其实我觉得用一个词来形容这个算法挺合适的:暴力. 是啊,就是循环+暴力.没什么难的... 先来看一道裸题. 那么对于这道题,显然我们的暴力算法就是枚举区间的左右端点,然后通过前缀和 ...
随机推荐
- 模块cv2的用法
一.读入图像 使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整路径 flags:读入图片的标志 cv2.IMREAD_COLOR:默认参数 ...
- cocos dos命令
- 浅谈USB驱动架构 转载
去年,老师让我分析基于HD3系统芯片的WindowsCE USB驱动的可行性.USB驱动非常庞大,多个软件层次相互交错,以及各种协议,USB系统对于一般人很难理解,我对其也只是理解一个大概,下面,我对 ...
- Matlab学以致用--模拟os任务装载情况
2012-06-08 21:26:42 用matlab来建模,仿真不同时刻os task在队列中的装载情况.输入参数如下 作为初学者,M文件写的有点长.能实现功能就算学以致用了. clear;clc ...
- 二分法bug修复
public class Main { public static void main(String[] args) { int[] arr = {1,2,3,4,5,6,7,8,9,10}; int ...
- 什么是DevOps
历史回顾 为了能够更好的理解什么是DevOps,我们很有必要对当时还只有程序员(此前还没有派生出开发者,前台工程师,后台工程师之类)这个称号存在的历史进行一下回顾. 如编程之道中所言: 老一辈的程序员 ...
- Pdf Convert Image 的解决方案
brew uninstall ghostscript brew install ghostscript gs -dNOPAUSE -sDEVICE=jpeg -r150 -sOutputFile=./ ...
- 【题解】Luogu P4198 楼房重建
原题传送门 根据斜率来建线段树,线段树维护区间最大斜率以及区间内能看见的楼房的数量(不考虑其他地方的原因,两个节点合并时再考虑) 细节见程序 #include <bits/stdc++.h> ...
- npm install
npm install moduleName 命令 1. 安装模块到项目node_modules目录下.2. 不会将模块依赖写入devDependencies或dependencies 节点.3. 运 ...
- 让小乌龟可以唱歌——对Python turtle进行拓展
在Scratch中,小猫是可以唱歌的,而且Scratch的声音木块有着丰富的功能,在这方面Python turtle略有欠缺,今天我们就来完善一下. Python声音模块 Python处理声音的模块很 ...