POJ 3070 Fibonacci(矩阵快速幂)
矩阵快速幂入门题F[n] 为第 n 个斐波那契数,F[n]=F[n-1]*1+F[n-2]*1,F[n-1]=F[n-1]*1+F[n-2]*0所以,利用矩阵可化简为其中转移矩阵的个数有 n-2 个,而且 F[2]=F[1]=1所以只需要计算转移矩阵的 n 次方,再将第一行的两个数相加即可#include <iostream>#include <cstdio>#includ
·
矩阵快速幂入门题
F[n] 为第 n 个斐波那契数,
F[n]=F[n-1]*1+F[n-2]*1,F[n-1]=F[n-1]*1+F[n-2]*0
所以,利用矩阵可化简为
其中转移矩阵的个数有 n-2 个,而且 F[2]=F[1]=1
所以只需要计算转移矩阵的 n 次方,再将第一行的两个数相加即可
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 2+5
#define mod 10000
using namespace std;
typedef long long ll;
int n,m;
int i,j,k;
//int a[N];
struct node
{
ll g[N][N];
node(){ memset(g,0,sizeof g); }
node operator*(node a){
node ans;
for(int i=1;i<=2;i++){
for(int j=1;j<=2;j++){
for(int k=1;k<=2;k++){
ans.g[i][j]=(ans.g[i][j]+g[i][k]*a.g[k][j]%mod)%mod;
}
}
}
return ans;
}
}ans;
node pow_mod(node a,int x)
{
node ans;
for(int i=1;i<=2;i++) ans.g[i][i]=1;
while(x){
if(x&1) ans=ans*a;
a=a*a;
x>>=1;
}
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
while(cin>>n){
if(n==-1) break;
if(!n) { cout<<0<<endl; continue; }
if(n<=2) { cout<<1<<endl; continue; }
node a; //转移矩阵
a.g[1][1]=a.g[1][2]=a.g[2][1]=1;
a=pow_mod(a,n-2);
cout<<(a.g[1][2]+a.g[1][1])%mod<<endl;
}
return 0;
}
点击阅读全文
更多推荐
活动日历
查看更多
直播时间 2025-02-26 16:00:00


直播时间 2025-01-08 16:30:00


直播时间 2024-12-11 16:30:00


直播时间 2024-11-27 16:30:00


直播时间 2024-11-21 16:30:00


所有评论(0)