uva10277 - Boastin' Red Socks(炫耀红白袜子)

本文介绍了一种通过调整算法策略从严重的时间限制超出(TLE)问题中解脱的方法,并分享了具体的编程实现细节。

暴力啊,,

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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值