暴力啊,,
对p/q求最大公约数,使其互质。
然后正确答案肯定是符合条件:
r*(r-1) = p*k
n*(n-1) = q*k
开始的时候我对p,q暴力(p<q),使k从1开始到q*k>50000*(50000-1)
虽然每次都是成倍的增长,但是范围实在太大了,所以交上去严重TLE
后来对n暴力,使得n从2到50000。。。。才得以解脱TLE的困惑。
后来忘了一个特判。wa了好几次。。。
加上p=0的情况。才终于ac了
代码如下:
#include <cstdio>
#include <cmath>
long long INF = 50000;
long long p, q, ansb, ansr;
long long gcd(long long a, long long b)
{
return b==0?a:gcd(b,a%b);
}
int ok(long long qq, long long i)
{
if(qq%q) return 0;
long long n = qq/q;
long long pp = p*n;
long long t = sqrt(pp+0.5);
if(t*(t+1)==pp)
{
ansr = t+1;
ansb = i-t-1;
return 1;
}
return 0;
}
int main ()
{
while(scanf("%lld%lld",&p,&q),p+q)
{
if(p==0) {puts("0 2"); continue;}
long long t = gcd(q,p);
p/=t; q/=t; ansr = ansb = 0;
for(long long i = 2; i <= INF; i++)
{
if(ok(i*(i-1),i)) break;
}
if(ansr==0&&ansb==0) printf("impossible\n");
else printf("%lld %lld\n",ansr,ansb);
}
return 0;
}