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 ...
随机推荐
- #学号 20175201张驰 《Java程序设计》第10周课下作业MyList
参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 public class MyList { public static void main(String [] ...
- JAVA第二周课程总结
本周我们开始学习一门新的课程JAVA 本周主要学习内容: 1.认识java,以及它的开发工具jdk 2.了解Java的语言特点 3.搭建Java开发环境,jdk的安装和配置
- sensu
https://blog.csdn.net/enweitech/article/details/53763324
- React Native商城项目实战07 - 设置“More”界面导航条
1.More/More.js /** * 更多 */ import React, { Component } from 'react'; import { AppRegistry, StyleShee ...
- getBoundingClientRect 和 requestAnimFrame 的polyfill
概述 今天在项目中用到了 getBoundingClientRect 和 requestAnimFrame ,查了下它们的polyfill,记录下来,供以后开发时参考,相信对其他人也有用. getBo ...
- delphi 每英寸相素点取值偏差
在所有资料中,每英寸相素点之比一般是这两个值,即:0.0393700788 25.399999961392 但是在GDI编程中,却遇到LOGPIXELSX LOGPIXELSY 在取值为96DPI ...
- Windows 2008任务计划执行bat脚本失败返回0x1
测试环境: C:\>systeminfo | findstr /c:"OS Name"OS Name: Microsoft Windows ...
- java调用com组件com4j
com4j A Java library that allows Java applications to seemlessly interoperate with Microsoft Compone ...
- PHP Memcache 扩展安装
PHP Memcache 扩展安装 PHP Memcache 扩展包下载地址:http://pecl.php.net/package/memcache,你可以下载最新稳定包(stable). 下载对应 ...
- 【Python】我的豆瓣短评爬虫的多线程改写
对之前我的那个豆瓣的短评的爬虫,进行了一下架构性的改动.尽可能实现了模块的分离.但是总是感觉不完美.暂时也没心情折腾了. 同时也添加了多线程的实现.具体过程见下. 改动 独立出来的部分: MakeOp ...