洛谷 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 }