CF Gym100548 K Last Defence 解题报告
先特判掉特殊情况:
- $a=b,Ans=2$
- $ab=0,a+b>0,Ans=2$
- $a=b=0,Ans=1$
考虑剩下的非特殊情况。记$Solve(a,b)$为数列中除了$a,b$外的不同的数的个数,分两种情况:
- $b|a$,设$a=kb$,那么数列会出现的数有:$0,b,2b,3b,\cdots,kb$,那么$Solve(a,b)=k-1$。
- $b\nmid a$,设$a=kb+r$,那么数列中会出现的与$a$在对$b$取模下同余的数有:$r,r+b,r+2b,\cdots,r+kb$,那么可以得到$Solve(a,b)=Solve(b,r)+k$。
所以最后$Ans=Solve(a,b)+2$。
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 typedef long long LL; 5 6 int Case, T; 7 LL a, b, cnt; 8 9 inline LL Solve(LL x, LL y) 10 { 11 if (x % y == 0) return x / y - 1; 12 LL res = x / y; 13 return Solve(y, x % y) + res; 14 } 15 16 int main() 17 { 18 scanf("%d", &Case); 19 for (T = 1; T <= Case; T ++) 20 { 21 cin >> a >> b; 22 if (a == 0 && b == 0) cnt = 1; 23 else if (a == b || a == 0 || b == 0) cnt = 2; 24 else cnt = Solve(a, b) + 2; 25 printf("Case #%d: ", T); 26 cout << cnt << endl; 27 } 28 return 0; 29 }