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;

}

 

你可能感兴趣的:(uva)