小z 学会了斐波那契和 gcd 后,老师又给他出了个难题,求第N个和第M个斐波那契数的最大公约数,这可难倒了小z ,不过在小z 的再三请求下,老师又告诉他了个条件,gcd(N,M)∈[1,90]。
可是,笨拙的小z 还是不会,于是请求你帮他解答这个问题。
输入格式:
输入包括 T 组,T∈[1,10].
接下来 T 行,每行两个整数 N,M, 表示斐波那契的第 N 项和第 M 项,(N,M∈[1,1018]).
输出格式:
输出包含 T 行,每行输出一个整数.
样例:
思路:根据范围小的去找范围大的,先进行打表
有一个公式:gcd(fn,fm)=f(gcd(n,m))
1 #include<iostream>
2 #include<iomanip>
3 #include<string.h>
4 #include<set>
5 #include<map>
6 #include<stdio.h>
7 #include<queue>
8 #define inf 0x3f3f3f3f
9 using namespace std;
10 typedef long long ll;
11
12 ll gcd(ll x,ll y)
13 {
14 if(y==0)
15 return x;
16 return gcd(y,x%y);
17 }
18
19 //ll f(ll x)//项数
20 //{
21 // if(x==0)
22 // return 0;
23 // if(x==1)
24 // return 1;
25 // else
26 // return f(x-1)+f(x-2);
27 //}
28 ll f[110];
29 void init()
30 {
31 f[0]=0;
32 f[1]=1;
33 for(int i=2;i<100;i++)
34 f[i]=f[i-1]+f[i-2];
35 }
36
37 int main()
38 {
39 std::ios::sync_with_stdio(false);
40 cin.tie(0);
41 cout.tie(0);
42 init();
43 int t;
44 long long n,m;
45 scanf("%d",&t);
46 while(t--)
47 {
48 scanf("%lld %lld",&n,&m);
49 cout<<f[gcd(n,m)]<<endl;
50 }
51 return 0;
52 }