poj3070(矩阵快速幂)

传送门

ac代码:

#include <iostream>
#include<stdio.h>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<functional>
#include<utility>
#include<string>
#include<string.h>
#include<vector>
#include<iomanip>
#include<stack>
#include<queue>
#include<set>
#include<map>
#define per(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
//#define int long long
const int inf =0x3f3f3f3f;
const double eps=1e-8;
int read(){
    char ch=getchar();
    int res=0,f=0;
    while(ch<'0' || ch>'9'){f=(ch=='-'?-1:1);ch=getchar();}
    while(ch>='0'&&ch<='9'){res=res*10+(ch-'0');ch=getchar();}
    return res*f;
}
// ------------------------head
#define mod 10000
const int siz=5e4+5;
int n;
const int N=2;//N means the max dimensions of matrix
struct mat{
    int a[N][N];
    mat(){memset(a,0,sizeof(a));for(int i=0;i<N;i++)a[i][i]=1;}
    mat operator*(mat rhs){
        mat res;
        memset(res.a,0,sizeof(res.a));
        for(int i=0;i<N;i++)for(int j=0;j<N;j++){
            for(int k=0;k<N;k++){
                res.a[i][j]=(res.a[i][j]+a[i][k]*rhs.a[k][j]%mod)%mod;
            }
        }
        return res;
    }
    mat power(int k){
        mat res,tmp=*this;
        while(k){
            if(k&1)res=res*tmp;
            tmp=tmp*tmp;
            k/=2;
            //printf("res:\n");//
            //per(i,0,1){per(j,0,1)printf("%d ",res.a[i][j]);printf("\n");};
            //per(i,0,1){per(j,0,1)printf("%d ",tmp.a[i][j]);printf("\n");};
        }
        return res;
    }
};

signed main()
{
    while(scanf("%d",&n)!=EOF&&n!=-1){
        //printf("n:%d\n",n);//
        if(n==0){printf("0\n");continue;}
        mat m1,m2;
        m1.a[0][0]=1;m1.a[0][1]=1;m1.a[1][0]=1;m1.a[1][1]=0;
        m2=m1.power(n);
        printf("%d\n",m2.a[0][1]);
    }
    return 0;
}

 

posted @ 2018-09-14 17:43  WindFreedom  阅读(589)  评论(0编辑  收藏  举报