uva 10277 Boastin' Red Socks

概率题

给你p和q,表示概率p/q,当有n个红袜子,m个黑袜子时,取两次,两次都是红袜子的概率为p/q,输出n和m,如果不可能则输出impossible

设总袜子数为b,红袜子数为a,则a/b*(a-1)/(b-1)=p/q , 可见分子p是a*(a-1)的形式,分母q也是这种形式

所以我们用暴力来枚举i*(i-1)分母,并且当分子也能写成j*(j+1)的形式时就找到了解

其实这题意义不大也不是什么经典题,能AC也就行了不必太抠

#include <cstdio>
#include <cmath>

long long gcd(long long a , long long b)
{ return b==0 ? a : gcd(b,a%b); }

int main()
{
    long long p,q;
    while(scanf("%lld%lld",&p,&q))
    {
       if(!p && !q) break;
       if(p==q)  //概率为1
       { printf("2 0\n"); continue;}
       if(p==0)  //概率为0
       { printf("0 2\n"); continue;}
       long long g=gcd(p,q);
       p/=g; q/=g;
       long long i,j;
       for(i=2; i<=50000; i++)
           if(i*(i-1)%q==0)
           {
                long long n=i*(i-1)/q;
                long long m=n*p;
                j=(long long)sqrt(m+0.5);
                if(j*(j+1)==m && j+1>=2)
                    break;
           }
        if(i>50000) printf("impossible\n");
        else        printf("%lld %lld\n",j+1,i-j-1);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/scau20110726/p/2909060.html