题意:
S0=A,S1=B,Sn=|Sn-1-Sn-2|
输入A,B求S序列中有几个不同的数
思路:
随便先写一组A,B会发现最后会出现0
其实分析一下会发现,首先默认B>A那么
S1=B=KA+r,S2=B-A=(K-1)A+r
S3=|S2-S1|=|B-A-B|=A
S4=|S3-S2|=(K-2)A+r
也就是说对于这样的操作当K=0时结束,而出现了K个不同的数,也就是最后留下r
然后是r减去A
整过过程就类似于一个辗转相除法
每次增加的值是商,最后的答案还要加上0
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
using namespace std;
int main()
{
int t,cas=1;
scanf("%d",&t);
while(t--)
{
long long a,b,maxn,minn;
long long cou=0;
scanf("%lld%lld",&a,&b);
maxn=max(a,b);
minn=min(a,b);
printf("Case #%d: ",cas++);
if(a==0&&b==0)
printf("1\n");
else if(a==0||b==0)
printf("2\n");
else
{
while(1)
{
cou+=maxn/minn;
long long r=maxn-maxn/minn*minn;
long long p=minn;
minn=r;
maxn=p;
if(r==0)
break;
}
printf("%lld\n",cou+1);
}
}
return 0;
}