一道要动脑的题目。
可以发现,一定会有下面两种情况。
a, b, ..., b, (a % b); (a / b) & 1
a, b, ..., b, (b - a % b); (a / b) % 2 == 0
其中...加上b后面的数的不同数字有a / b个。
然后递归解决。
可以发现,这个过程看似是更相减损术,实则是gcd算法,这也可以让我们明白其实更相减损术的本质就是gcd算法。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<ll> vll;
const int MAXN = 1e6 + 10;
const ll INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
const double eps = 1e-8;
int n, m, k;
ll gcd(ll a, ll b){
if(!b)
return a;
return gcd(b, a % b);
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cout << setprecision(10) << fixed;
int times;
cin >> times;
for(int t = 1; t <= times; t++){
ll a, b;
cin >> a >> b;
if(a < b)
swap(a, b);
if(!b){
cout << "Case #" << t << ": ";
cout << (a != b) + 1 << endl;
continue;
}
ll g = gcd(a, b);
a /= g;
b /= g;
ll sum = 0;
while(a % b){
// cerr << "a = " << a << " b = " << b << endl;
ll v = a / b;
ll remain = a % b;
sum += v;
a = b;
if(v & 1)
b = remain;
else
b = b - remain;
}
cout << "Case #" << t << ": ";
cout << sum + (a / b) + 1 << endl;
}
// cerr << "execute time : " << (double)clock() / CLOCKS_PER_SEC << endl;
return 0;
}
未来可期。