讲解: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快速幂 模板的更多相关文章

  1. POJ3070 矩阵快速幂模板

    题目:http://poj.org/problem?id=3070 矩阵快速幂模板.mod写到乘法的定义部分就行了. 别忘了 I ( ) 和 i n i t ( ) 要传引用! #include< ...

  2. 51nod1113(矩阵快速幂模板)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 题意:中文题诶- 思路:矩阵快速幂模板 代码: #inc ...

  3. 89. a^b【快速幂模板】

    a^b Description 求 aa 的 bb 次方对 pp 取模的值. 输入格式 三个整数 a,b,pa,b,p ,在同一行用空格隔开. 输出格式 输出一个整数,表示a^b mod p的值. 数 ...

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

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

  5. 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 > ...

  6. luoguP3390(矩阵快速幂模板题)

    链接:https://www.luogu.org/problemnew/show/P3390 题意:矩阵快速幂模板题,思路和快速幂一致,只需提供矩阵的乘法即可. AC代码: #include<c ...

  7. hdu 2604 矩阵快速幂模板题

    /* 矩阵快速幂: 第n个人如果是m,有f(n-1)种合法结果 第n个人如果是f,对于第n-1和n-2个人有四种ff,fm,mf,mm其中合法的只有fm和mm 对于ffm第n-3个人只能是m那么有f( ...

  8. POJ 3070 Fibonacci 矩阵快速幂模板

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18607   Accepted: 12920 Descr ...

  9. CodeForces 450B (矩阵快速幂模板题+负数取模)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51919 题目大意:斐波那契数列推导.给定前f1,f2,推出指定第N ...

随机推荐

  1. pip安装报错:Fatal error in launcher: Unable to create process using '"'

    pip安装包报错 解决方案: pip需要升级,可使用以下脚本: python -m pip install -U pip

  2. webpack中的 chunk,module,bundle的区别,以及hidden modules是什么

    hidden modules是什么: chunk,module,bundle的区别 总结: module是指任意的文件模块,等价于commonjs中的模块 chunks是webpack处理过程中被分组 ...

  3. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第3节 maven标准目录结构和常用命令_07maven常用命令

    以给的hellowordl的的代码为例. src/main/java下,这是主业务逻辑代码 里面的内容只有一个jsp的跳转 测试包下: 里面很简单的就输出了一句话 复制项目的目录 先cd进入复制的这个 ...

  4. 用例a失败,跳过测试用例b和c并标记失败xfail

    前言 当用例a失败的时候,如果用例b和用例c都是依赖于第一个用例的结果,那可以直接跳过用例b和c的测试,直接给他标记失败xfail用到的场景,登录是第一个用例,登录之后的操作b是第二个用例,登录之后操 ...

  5. 查看dll中的函数(方法)

    https://jingyan.baidu.com/article/5553fa82b953b365a23934b7.html 查看dll中的函数(方法) 听语音 | 浏览:2004 | 更新:201 ...

  6. jupyter 服务器安装随笔

    python3:python3 -m pip install --upgrade pip python3 -m pip install jupyterpkg install py36-pyzmq-18 ...

  7. 梳理检测论文-Refinement Neural Network

    Single-Shot Refinement Neural Network for Object Detection 目录 1. motivation 2. RefineDet 解析(Network ...

  8. python下对文件的操作(非目录)

    总文件夹 子文件夹01 文档01.txt-------------------------------------------------------------------------------- ...

  9. python 并发编程 多进程 互斥锁 目录

    python 并发编程 多进程 互斥锁 模拟抢票 互斥锁与join区别

  10. Maven 项目中的groupId和artifactId

    maven进行项目管理,如果我们要将项目加入到maven到本地仓库中,则需要对项目进行唯一性标示,而groupId和artifactId就起到这样对作用. groupId为项目组织对唯一标识符,可以理 ...