2019.3.30

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 }
View Code

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 }
poj 3070

 

posted @ 2019-03-30 15:57  XXrl  阅读(106)  评论(0编辑  收藏  举报