1.快速幂:
用11举例,11=2^0+2^1+2^3
1 int main() 2 { 3 ll a,b; 4 while(cin>>a>>b){ 5 ll ans=1,p=a; 6 while(b){ 7 if(b&1) 8 ans*=p; 9 p*=p; 10 b>>=1; 11 } 12 cout<<ans<<endl; 13 } 14 return 0; 15 }
2.矩阵快速幂
求斐波那契数列,求F(n)等于求二阶矩阵的n - 1次方,所以答案为a[0][0];
下题
F(n)在a[0][1],故答案为a[0][1].
http://poj.org/problem?id=3070
1 #include<iostream> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define N 15000 7 #define ll long long 8 #define inf 0x3f3f3f3f 9 #define mem(a) memset(a,0,sizeof(a)) 10 const int mod=1e4; 11 struct mat{ 12 int a[2][2]; 13 }; 14 mat mat_mul(mat x,mat y){ 15 mat res; 16 mem(res.a); 17 for(int i=0;i<2;i++) 18 for(int j=0;j<2;j++){ 19 res.a[i][j]=0; 20 for(int k=0;k<2;k++) 21 res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j])%mod; 22 } 23 return res; 24 } 25 int pow(mat x,int n){ 26 mat ans; 27 ans.a[0][0]=1,ans.a[1][0]=0; 28 ans.a[0][1]=0,ans.a[1][1]=1; 29 while(n){ 30 if(n&1) 31 ans=mat_mul(ans,x); 32 x=mat_mul(x,x); 33 n>>=1; 34 } 35 return ans.a[0][1]; 36 } 37 int main() 38 { 39 int n; 40 mat base={1,1,1,0}; 41 while(cin>>n&&n!=-1){ 42 cout<<pow(base,n)<<endl; 43 } 44 return 0; 45 }