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