1. 程式人生 > >poj 3070(矩陣快速冪入門)

poj 3070(矩陣快速冪入門)

這一 color esp 不知道 algorithm div pan names long

題目:http://poj.org/problem?id=3070

代碼:

#include<iostream>
#include<algorithm>
using namespace std;
const int mod=10000;
struct matrix
{
    int m[2][2];
}ans,base;//這裏用一個結構體數組不知道省了多少代碼

//base數組記入的是矩陣的2^x次冪 

matrix multi(matrix a,matrix b)//返回的是結構體裏的東西我們就要用 結構體來寫類型 
{
    matrix tem;//臨時寫的關於結構體的一個數組 用作中間過渡用 
for(int i=0;i<2;i++) for(int j=0;j<2;j++) { tem.m[i][j]=0;// 初始化 for(int k=0;k<2;k++) { tem.m[i][j]=(tem.m[i][j]+a.m[i][k]*b.m[k][j])%mod;//把你算的東西存入tem裏 } } return tem;//返回的就是你這一次作乘法的結果 } int fast_mod(int n) { base
.m[0][0]=base.m[0][1]=base.m[1][0]=1;//題目裏寫的矩陣 base.m[1][1]=0; ans.m[0][0]=ans.m[1][1]=1;//這個是一個單位矩陣 ans.m[1][0]=ans.m[0][1]=0; while(n) { if(n&1)//表示n為奇數的情況 { ans=multi(ans,base); } base=multi(base,base); n>>=1;//每次除2 }
return ans.m[0][1]; } int main() { long long n; while(scanf("%lld",&n)!=EOF&&n!=-1) { printf("%d\n",fast_mod(n)); } return 0; }

poj 3070(矩陣快速冪入門)