讲解: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. jQuery file upload上传图片出错分析

    以https://github.com/blueimp/jQuery-File-Upload/blob/master/basic-plus.html为例 注释掉load-image.all.min.j ...

  2. 使用mybatis-generator-core-1.3.2.jar根据数据库表自动生成实体

    1 导入mybatis-generator-core-1.3.2.jar 2配置mbg.xml <?xml version="1.0" encoding="UTF- ...

  3. MYSQL启用数据库错误:ERROR 2002 (HY000)

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) MYSQL服务 ...

  4. Flink组件及特性

    Flink 是一个针对流数据和批数据的分布式处理引擎.它主要是由 Java 代码实现.目前主要还是依靠开源社区的贡献而发展.对 Flink 而言,其所要处理的主要场景就是流数据,批数据只是流数据的一个 ...

  5. wcf restful 访问报错 *.svc HTTP error 404.17 - Not Found

    安装完成 iisreset,即使不重启也已经可以使用了

  6. Android:adb shell 命令详解

    安卓系统是基于Linux系统开发,也就支持常见的Linux的命令,这些命令都保存在手机“/system/bin”的目录下,通过adb shell 便可以调用这些命令. 进入“/system/bin”该 ...

  7. 【Appium遇到的坑】环境配置无误,路径无中文,无空格,提示error: Logcat capture failed: spawn ENOENT

    代码如下,提示error: Logcat capture failed: spawn ENOENT from appium import webdriver from time import slee ...

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

  9. css文件引用

    #i1l{ background-color: chartreuse; height: 40px; } #i2l{ background-color: olivedrab; height: 40px; ...

  10. kubernetes(k8s)容器编排工具基础概念

    Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controller-kubernetes 官网:https://ku ...