uva10277 - Boastin' Red Socks(炫耀红白袜子)
暴力啊,,
对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; }