Luogu 1962(矩阵快速幂)
2017-10-19 23:00
274 查看
传送门
图片转自:http://www.cnblogs.com/huxianglin/p/5995649.html
代码作为模板。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
ll n;
struct Matrix {
int v[2][2];
Matrix() {memset(v,0,sizeof(v));}
}un,t;
Matrix mult(Matrix a,Matrix b) {
Matrix ret;
for (int k=0;k<2;++k)
for (int i=0;i<2;++i)
for (int j=0;j<2;++j)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j]%MOD)%MOD;
return ret;
}
int main() {
scanf("%lld",&n);
un.v[0][0]=un.v[1][1]=1;
t.v[0][0]=t.v[0][1]=t.v[1][0]=1;
while (n) {
if (n&1) un=mult(un,t);
t=mult(t,t),n>>=1;
}
printf("%lld\n",un.v[1][0]);
return 0;
}
图片转自:http://www.cnblogs.com/huxianglin/p/5995649.html
代码作为模板。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
ll n;
struct Matrix {
int v[2][2];
Matrix() {memset(v,0,sizeof(v));}
}un,t;
Matrix mult(Matrix a,Matrix b) {
Matrix ret;
for (int k=0;k<2;++k)
for (int i=0;i<2;++i)
for (int j=0;j<2;++j)
ret.v[i][j]=(ret.v[i][j]+1ll*a.v[i][k]*b.v[k][j]%MOD)%MOD;
return ret;
}
int main() {
scanf("%lld",&n);
un.v[0][0]=un.v[1][1]=1;
t.v[0][0]=t.v[0][1]=t.v[1][0]=1;
while (n) {
if (n&1) un=mult(un,t);
t=mult(t,t),n>>=1;
}
printf("%lld\n",un.v[1][0]);
return 0;
}
相关文章推荐
- 矩阵快速幂模板及其应用(洛谷3390)(洛谷1962)
- Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)
- [luoguP1962] 斐波那契数列(矩阵快速幂)
- Luogu-3390 (矩阵快速幂模板)
- 洛谷P1962 计蒜课习题 fib数列问题之二 矩阵二分快速幂
- [luogu2044][NOI2012] 随机数生成器 [矩阵快速幂]
- Luogu 3390(矩阵快速幂)
- LuoguP1962 斐波那契数列 解题报告【矩阵快速幂】
- [luogu1707] 刷题比赛 [矩阵快速幂]
- luogu P3390 【模板】矩阵快速幂
- Luogu 1962 斐波那契数列(矩阵,递推)
- 矩阵儿快速幂 - POJ 3233 矩阵力量系列
- 矩阵运算 快速幂
- 矩阵快速幂
- poj 3150 Cellular Automaton(矩阵快速幂)
- hdu 5015 矩阵快速幂
- hdu4565 So Easy!(矩阵快速幂)
- 斐波那契 矩阵快速幂
- Gym 101161 G - Binary Strings[矩阵快速幂][dp]
- CodeForces 575 A.Fibonotci(矩阵快速幂+线段树)