题目链接:https://hpuoj.com/contest/24/problem/A/
input
3
1 2
2 3
3 4
output
1
1
1
数据范围很大,根据推论来写:
gcd(f[n],f[m])=f[gcd(n,m)]
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long f[100];
long long N,M,t;
void solve(){
memset(f,0,sizeof(f));
f[1]=1,f[2]=1;
for(int i=3; i<=90; i++)
f[i]=f[i-1]+f[i-2];
}
int main(){
int T;
scanf("%d",&T);
solve();
while(T--){
scanf("%lld%lld",&N,&M);
if(M<N){
t=M;
M=N;
N=t;
}
long long r;//辗转相除
while((r=M%N)!=0){
M=N;
N=r;
}
printf("%lld\n",f[N]);
}
return 0;
}
扩展推论:Fibonacci的前n项和,等于第n-2项的值-1
f[6]=前6-2项的值-f2.------->Fibonacci的前n项和,等于第n+2项的值-1