NZAU 1202: GCD 矩阵快速幂 gcd和fib数列一些结论
2017-07-19 17:01
246 查看
斐波那契数列的性质 - Milkor - 博客园 http://www.cnblogs.com/Milkor/p/4734763.html
fn * 1 1 = fn-1
fn-1 1 0 fn-2
所以 1 1 ^ n * 1 结果中的 第二行第一列的值就是fn
1 0 0
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
using namespace std;
const int INF=1e9+10;
typedef long long ll;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
typedef vector<ll> vec;
typedef vector<vec> mat;
int mod;
mat mul(mat &A,mat &B){
mat C(A.size(),vec(B[0].size()));
for(int i=0;i<(int)A.size();i++)
for(int k=0;k<(int)B.size();k++)
for(int j=0;j<(int)B[0].size();j++)
C[i][j]=(1LL*C[i][j]+1LL*A[i][k]*B[k][j])%mod;
return C;
}
mat matpow(mat A,ll n){
mat B(A.size(),vec(A.size()));
for(int i=0;i<(int)A.size();i++)
B[i][i]=1;
while(n){
if(n&1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
int main(){
int a,b;
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&a,&b,&mod);
mat A(2,vec(2));
A[0][0]=1; A[0][1]=1;
A[1][0]=1; A[1][1]=0;
int k=gcd(a+2,b+2);
A=matpow(A,k);
printf("%d\n",A[1][0] );
}
return 0;
}
fn * 1 1 = fn-1
fn-1 1 0 fn-2
所以 1 1 ^ n * 1 结果中的 第二行第一列的值就是fn
1 0 0
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
using namespace std;
const int INF=1e9+10;
typedef long long ll;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
typedef vector<ll> vec;
typedef vector<vec> mat;
int mod;
mat mul(mat &A,mat &B){
mat C(A.size(),vec(B[0].size()));
for(int i=0;i<(int)A.size();i++)
for(int k=0;k<(int)B.size();k++)
for(int j=0;j<(int)B[0].size();j++)
C[i][j]=(1LL*C[i][j]+1LL*A[i][k]*B[k][j])%mod;
return C;
}
mat matpow(mat A,ll n){
mat B(A.size(),vec(A.size()));
for(int i=0;i<(int)A.size();i++)
B[i][i]=1;
while(n){
if(n&1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
int main(){
int a,b;
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&a,&b,&mod);
mat A(2,vec(2));
A[0][0]=1; A[0][1]=1;
A[1][0]=1; A[1][1]=0;
int k=gcd(a+2,b+2);
A=matpow(A,k);
printf("%d\n",A[1][0] );
}
return 0;
}
相关文章推荐
- UVA 10689 Yet another Number Sequence(矩阵快速幂求Fib数列)
- 洛谷P1962 计蒜课习题 fib数列问题之二 矩阵二分快速幂
- HZAU 1202 GCD (矩阵快速幂 + GCD)
- hzau 1202 GCD(矩阵快速幂)
- hzau1202——GCD(斐波那契&矩阵快速幂)
- UVA 10689 Yet another Number Sequence(矩阵快速幂求Fib数列)
- ACdream 1116 扩展KMP 线段树区间累加 Fib数列的矩阵加速
- POJ 3070 矩阵快速幂解决fib问题
- codevs 3332 数列(矩阵快速幂)
- 斐波那契数列的第N项(1≤n≤10^18 矩阵快速幂)
- 矩阵快速幂-GCD-斐波那契-HZAU2017现场赛-D
- Xn数列(矩阵乘法+快速幂+慢速乘法)
- pku 3070 Fibonacci 矩阵快速幂相乘求Fibonacci 数列
- 矩阵的一些常用结论
- 【模拟试题】数列 矩阵快速幂
- 快速获取数列/矩阵中前项元素累积和
- 【矩阵快速幂相乘求Fibonacci 数列】PKU-3070-Fibonacci
- hdu 3221 Brute-force Algorithm(快速幂取模,矩阵快速幂求fib)
- 斐波那契数列 打表+矩阵快速幂
- fib(限制内存)矩阵+快速幂