Matrix快速幂 模板
讲解:http://www.cnblogs.com/SYCstudio/p/7211050.html
给定n*n的矩阵A,求A^k
https://www.luogu.org/problem/show?pid=3390
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std; #define ll long long const int maxN=;
const ll Mod=;
const ll inf=; int n; class Matrix
{
public:
ll M[maxN][maxN];
Matrix(int x)
{
for (int i=;i<n;i++)
for (int j=;j<n;j++)
M[i][j]=x;
}
Matrix(ll Arr[maxN][maxN])
{
for (int i=;i<n;i++)
for (int j=;j<n;j++)
M[i][j]=Arr[i][j];
}
void print()
{
for (int i=;i<n;i++)
{
for (int j=;j<n;j++)
cout<<M[i][j]<<' ';
cout<<endl;
}
}
}; Matrix operator * (Matrix A,Matrix B)
{
Matrix Ans();
for (int i=;i<n;i++)
for (int j=;j<n;j++)
for (int k=;k<n;k++)
Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j]%Mod)%Mod;
return Ans;
} ll Arr[maxN][maxN]; ll read();
void Pow(ll Po); int main()
{
n=read();
ll Po=read();
for (int i=;i<n;i++)
for (int j=;j<n;j++)
Arr[i][j]=read();
Pow(Po-);//注意,这里为什么要-1呢,因为我们知道a^1是a,对于矩阵来说就是A^1是A,所以在传进去的时候先-1(相当于已经进行了一次操作),而若Po==1,则在Pow(Po-1)中不会执行循环,此时也正好是矩阵A(仔细揣摩一下)
return ;
} ll read()
{
ll x=;
ll k=;
char ch=getchar();
while (((ch>'')||(ch<''))&&(ch!='-'))
ch=getchar();
if (ch=='-')
{
k=-;
ch=getchar();
}
while ((ch>='')&&(ch<=''))
{
x=x*+ch-;
ch=getchar();
}
return x*k;
} void Pow(ll P)
{
Matrix A(Arr);
Matrix B(Arr);
while (P!=)
{
if (P&)
A=A*B;
B=B*B;
P=P>>;
}
A.print();
return;
}
例题 求斐波那契数列的第N项%MOD
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std; #define ll long long//注意用长整形,因为有可能会爆int const int Mod=;
const int inf=; class Matrix//定义矩阵
{
public:
ll M[][];
Matrix()
{
memset(M,,sizeof(M));
}
Matrix(int Arr[][])//定义两个方便的矩阵初始化
{
for (int i=;i<;i++)
for (int j=;j<;j++)
M[i][j]=Arr[i][j];
}
}; Matrix operator * (Matrix A,Matrix B)//重载乘号操作
{
Matrix Ans;
for (int i=;i<;i++)
for (int j=;j<;j++)
for (int k=;k<;k++)
Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j]%Mod)%Mod;
return Ans;
} ll n; int main()
{
cin>>n;
if (n<=)
{
cout<<<<endl;
return ;
}
n=n-;
int a[][]={{,},{,}};//初始矩阵
int b[][]={{,},{,}};//即上文的T
Matrix A(a);
Matrix B(b);
while (n!=)//快速幂
{
if (n&)
A=A*B;
B=B*B;
n=n>>;
}
cout<<A.M[][]<<endl;
return ;
}
例题 求广义斐波那契数列的第N项%MOD
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std; #define ll long long const int inf=; ll n,Mod,p,q,A1,A2; class Matrix//定义矩阵结构体
{
public:
ll M[][];
Matrix()
{
memset(M,,sizeof(M));
}
Matrix(ll Arr[][])
{
for (int i=;i<;i++)
for (int j=;j<;j++)
M[i][j]=Arr[i][j];
}
}; Matrix operator * (Matrix A,Matrix B)//重载乘法操作
{
Matrix Ans;
for (int i=;i<;i++)
for (int j=;j<;j++)
for (int k=;k<;k++)
Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j]%Mod)%Mod;
return Ans;
} int main()
{
cin>>p>>q>>A1>>A2>>n>>Mod;
if (n==)//1和2的情况特殊处理(虽然我也不知道是否有特殊点)
{
cout<<A1<<endl;
return ;
}
if (n==)
{
cout<<A2<<endl;
return ;
}
n=n-;
ll a[][]={{A2,A1},{,}};//初始矩阵
ll b[][]={{p,},{q,}};
Matrix A(a);
Matrix B(b);
while (n!=)//快速幂
{
if (n&)
A=A*B;
B=B*B;
n=n>>;
}
cout<<A.M[][]<<endl;
return ;
}
小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣。于是他决定做实验并
观察细胞分裂的规律。
他选取了一种特别的细胞,每天每个该细胞可以分裂出 x − 1 个新的细胞。
小 X 决定第 i 天向培养皿中加入 i 个细胞(在实验开始前培养皿中无细胞)。
现在他想知道第 n 天培养皿中总共会有多少个细胞。
由于细胞总数可能很多,你只要告诉他总数对 w 取模的值即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; #define ll long long ll n,X,Mod; class Matrix//定义一个矩阵结构体
{
public:
ll M[][];
Matrix()//初始化0
{
for (int i=;i<;i++)
for (int j=;j<;j++)
M[i][j]=;
}
Matrix(ll Arr[][])//用数组来初始化
{
for (int i=;i<;i++)
for (int j=;j<;j++)
M[i][j]=Arr[i][j];
}
}; Matrix operator * (Matrix A,Matrix B)//重载乘法运算符
{
Matrix Ans;
for (int i=;i<;i++)
for (int j=;j<;j++)
for (int k=;k<;k++)
Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j]%Mod)%Mod;
return Ans;
} const int inf=; ll Pow(); int main()//无比简单的主函数
{
cin>>n>>X>>Mod;
cout<<Pow()<<endl;
return ;
} ll Pow()//矩阵快速幂
{
ll a[][]={{,,},{,,},{,,}};//初始状态
ll b[][]={{X,,},{,,},{,,}};//用来使状态发生转移的矩阵,即文中提到的T
Matrix A(a);
Matrix B(b);
while (n!=)
{
if (n&)
{
A=A*B;//注意这里的乘法顺序,矩阵乘法不满足交换律
}
B=B*B;
n=n>>;
}
return A.M[][];//根据我们的定义,最后的值就在A.M[0][0]
}
Matrix快速幂 模板的更多相关文章
- POJ3070 矩阵快速幂模板
题目:http://poj.org/problem?id=3070 矩阵快速幂模板.mod写到乘法的定义部分就行了. 别忘了 I ( ) 和 i n i t ( ) 要传引用! #include< ...
- 51nod1113(矩阵快速幂模板)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 题意:中文题诶- 思路:矩阵快速幂模板 代码: #inc ...
- 89. a^b【快速幂模板】
a^b Description 求 aa 的 bb 次方对 pp 取模的值. 输入格式 三个整数 a,b,pa,b,p ,在同一行用空格隔开. 输出格式 输出一个整数,表示a^b mod p的值. 数 ...
- 矩阵快速幂模板(pascal)
洛谷P3390 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格 ...
- hdu-1757 A Simple Math Problem---矩阵快速幂模板题
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1757 题目大意: 求递推式第k项模m If x < 10 f(x) = x.If x > ...
- luoguP3390(矩阵快速幂模板题)
链接:https://www.luogu.org/problemnew/show/P3390 题意:矩阵快速幂模板题,思路和快速幂一致,只需提供矩阵的乘法即可. AC代码: #include<c ...
- hdu 2604 矩阵快速幂模板题
/* 矩阵快速幂: 第n个人如果是m,有f(n-1)种合法结果 第n个人如果是f,对于第n-1和n-2个人有四种ff,fm,mf,mm其中合法的只有fm和mm 对于ffm第n-3个人只能是m那么有f( ...
- POJ 3070 Fibonacci 矩阵快速幂模板
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18607 Accepted: 12920 Descr ...
- CodeForces 450B (矩阵快速幂模板题+负数取模)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51919 题目大意:斐波那契数列推导.给定前f1,f2,推出指定第N ...
随机推荐
- jQuery file upload上传图片出错分析
以https://github.com/blueimp/jQuery-File-Upload/blob/master/basic-plus.html为例 注释掉load-image.all.min.j ...
- 使用mybatis-generator-core-1.3.2.jar根据数据库表自动生成实体
1 导入mybatis-generator-core-1.3.2.jar 2配置mbg.xml <?xml version="1.0" encoding="UTF- ...
- MYSQL启用数据库错误:ERROR 2002 (HY000)
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) MYSQL服务 ...
- Flink组件及特性
Flink 是一个针对流数据和批数据的分布式处理引擎.它主要是由 Java 代码实现.目前主要还是依靠开源社区的贡献而发展.对 Flink 而言,其所要处理的主要场景就是流数据,批数据只是流数据的一个 ...
- wcf restful 访问报错 *.svc HTTP error 404.17 - Not Found
安装完成 iisreset,即使不重启也已经可以使用了
- Android:adb shell 命令详解
安卓系统是基于Linux系统开发,也就支持常见的Linux的命令,这些命令都保存在手机“/system/bin”的目录下,通过adb shell 便可以调用这些命令. 进入“/system/bin”该 ...
- 【Appium遇到的坑】环境配置无误,路径无中文,无空格,提示error: Logcat capture failed: spawn ENOENT
代码如下,提示error: Logcat capture failed: spawn ENOENT from appium import webdriver from time import slee ...
- if you wanna the rainbow, you have to deal with the rain.
bulk. n. 大量 reluctant. adj. 不情愿的 terrorist. n. 恐怖分子 recognition. n. 认出 tout.v. 兜售 conceal.v. 隐藏 dras ...
- css文件引用
#i1l{ background-color: chartreuse; height: 40px; } #i2l{ background-color: olivedrab; height: 40px; ...
- kubernetes(k8s)容器编排工具基础概念
Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controller-kubernetes 官网:https://ku ...