题意:给出数列前两项和递推公式,问你整个数列有多少个不同的数字
思路:我们首先打个表,发现会出现循环段,即x,x-b,b.然后分析一下
设A=x1;B=x2=k*x1+b;
S0=x1;S1=k*x1+b;S2=(k-1)x1+b;
S3=x1;S4=(k-2)*x1+b;S5=(k-3)*x1+b;
S6=x1;......
所以不同数字的个数和(k*x1+b)/x1有关,类似于辗转相除重复操作就可以了
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=1e9+7;
int main()
{
int t;
long long a,b,maxn,minn;
long long ans;
scanf("%d",&t);
for (int cases = 1; cases <= t; cases++)
{
ans=0;
scanf("%lld%lld",&a,&b);
if(b>a) swap(a,b);
printf("Case #%d: ",cases);
if(a==0&&b==0) printf("1\n");
else if(a==0||b==0) printf("2\n");
else
{
while(1)
{
ans+=a/b;
a=a%b;
swap(a,b);
if(b==0) break;
}
printf("%lld\n",ans+1);
}
}
return 0;
}