UVA_10277
如果设m为红袜子的数量,n为袜子总数,那么可以得到方程m^2-m-p/q*n*(n-1)=0,这时我们发现m和n应是一一对应的关系,因此我们可以通过枚举n来求得m,求的过程中判断m和n是否都为整数即可。
有了这个思路之后,如果直接解方程的话m是有误差的,因此我们可以考虑二分m,注意到函数在m>1/2的部分是单调的,于是我们预判一下是否存在m=0的情况,当然也就是p=0的情况,显然这时n最小为2,同时也可以顺便知道如果p=q那么n最小也为2。
剩下的工作就是枚举n然后把1作为m的下限二分m即可。
#include<stdio.h>
#include<string.h>
long long int P, Q;
long long int gcd(long long int x, long long int y)
{
return y == 0 ? x : gcd(y, x % y);
}
void solve()
{
long long int min, mid, max, ans, total, temp;
if(P == 0)
printf("0 2\n");
else if(P == Q)
printf("2 0\n");
else
{
ans = gcd(Q, P);
P /= ans, Q /= ans;
for(total = 3; total <= 50000; total ++)
{
temp = P * total * (total - 1);
if(temp % Q)
continue;
else
temp /= Q;
min = 1, max = total;
for(;;)
{
mid = (min + max) / 2;
if(mid == min)
break;
if(mid * mid - mid - temp > 0)
max = mid;
else
min = mid;
}
if(mid * mid - mid - temp == 0)
{
printf("%lld %lld\n", mid, total - mid);
return;
}
}
printf("impossible\n");
}
}
int main()
{
for(;;)
{
scanf("%lld%lld", &P, &Q);
if(!P && !Q)
break;
solve();
}
return 0;
}