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;
}


你可能感兴趣的:(uva10277 - Boastin' Red Socks(炫耀红白袜子))