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; }