zoukankan      html  css  js  c++  java
  • UVA 10277 Boastin' Red Socks

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


  • 相关阅读:
    C# Console.Read()和Console.ReadLine()的区别
    C#获取项目程序及运行路径的方法
    Thread理解
    ENVI 监督分类Max stdev from Mean 参数IDL中的设置
    C# 插件开发学习实例
    利用动软代码器自动生存三层架构
    结构体的对齐
    链表分类及应用
    指针
    双向循环链表
  • 原文地址:https://www.cnblogs.com/staginner/p/2285792.html
Copyright © 2011-2022 走看看