洛谷 P1306 斐波那契公约数

P1306 斐波那契公约数

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 LL a[2][2],b[2][2],c[2][2],f1,f2;
 5 #define mod 100000000
 6 
 7 LL gcd(LL a,LL b) { return !b?a:gcd(b,a%b);}
 8 
 9 void mi(LL x[2][2],LL y[2][2])
10 {
11     memset(c,0,sizeof(c));
12     for(int i=0;i<=1;i++)
13         for(int j=0;j<=1;j++)
14             for(int k=0;k<=1;k++)
15                 c[i][j]+=x[i][k]*y[k][j],c[i][j]%=mod;
16     for(int i=0;i<=1;i++)
17         for(int j=0;j<=1;j++)
18             x[i][j]=c[i][j];
19 }
20 int main()
21 {
22     scanf("%lld%lld",&f1,&f2);
23     LL p=gcd(f1,f2);
24     if(p==1||p==2){ printf("1\n"); return 0;}
25     p-=2;
26     a[0][0]=a[1][0]=a[0][1]=1;
27     b[0][0]=b[1][0]=b[0][1]=1;
28     while(p)
29     {
30         if(p&1) mi(a,b);
31         p>>=1; mi(b,b);
32     }
33     printf("%lld\n",a[0][0]);
34     return 0;
35 }
View Code

 

posted @ 2017-09-12 17:31  Alex丶Baker  阅读(119)  评论(0编辑  收藏  举报