問題
ここ参照。
方針
本番中は二分探索をしていた。ほとんどのケースは通っていたのだけれど、いくつかのケースで落ちていた。分数が既約分数だと思い込んでいたけど、そうじゃない場合もあるようだ。おそらく落ちた原因はそれだと思う。二分探索よりスマートでシンプルな解法があって、以下の2次不等式をiについて解けばよい。
平方根とか出てくるけど、マージンを取るような方向の近い整数に丸めるとよい。
ソースコード
using namespace std;
#define REP(i, n) for(int i=0; i<(int)(n); i++)
#define FOR(i, s, e) for (int i = (int)(s); i < (int)(e); i++)
long long gcd(long long a, long long b) {
if (!b)
return a;
return gcd(b, a%b);
}
int main() {
long long x, y;
char c;
cin >> x >> c >> y;
long long g = gcd(x, y);
x /= g;
y /= g;
bool res = false;
for (long long i = (2*x-y)/y/y; i <= (2*x+y)/y/y+1; i++) {
long long n = i*y;
long long sum = n*(n+1)/2;
long long m = sum - i*x;
if (1 <= m && m <= n) {
res = true;
cout << n << " " << m << endl;
}
}
if (!res)
puts("Impossible");
return 0;
}