再战斐波那契
单点时限: 1.0 sec
内存限制: 512 MB
小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 行,每行输出一个整数.
样例:
input
3 1 2 2 3 3 4
output
1 1 1
思路:根据范围小的去找范围大的,先进行打表
有一个公式: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 }
原文地址:https://www.cnblogs.com/OFSHK/p/11258925.html
时间: 2024-10-04 13:37:57