zoukankan      html  css  js  c++  java
  • HDU4206_Treasure Map_数学转换题_有技巧地暴力枚举

    题目大意:

                   给你一个直角三角形的一条直角边的平方n,这条边可能是直角边,然后要求求出另外一条直角边,还有求出斜边的长度,要求另外一条直角边跟斜边都是整数。 1 <= n <= 10^9.

    解题思路:

                   给出的直角边异常巨大,而且另外两条边的长度根本没有上限。但是可以转换。z^2 - y^2 = n,那么有(z + y)*(z - y) = n,变成了

    a * b = n,由于z跟y都是整数,那么a跟b都是整数,并且a跟b都肯定大于0,是自然数,因为z必定大于y。所以枚举出所有a跟b,然后

    z + y = a, z - y = b,由这两个公式求出z跟y即可。

    解题感想:

                  比赛的时候稍微想到了转换,但是闲麻烦就没有继续转换下去了,想想自己实在是太笨了。

    代码:

    #include <iostream>
    #include <cmath>
    using namespace std;

    int main(void)
    {
        int cas;
        scanf("%d", &cas);
        while(cas--)
        {
            int n, a, b, z, y;
            scanf("%d", &n);
            int tempn = (int)sqrt((double)n);
            int ansY, ansZ;
            ansY = ansZ = INT_MAX;
            for(int i = 1; i <= tempn; i++)
            {
                if(n % i == 0)
                {
                    a = n / i;
                    b = i;
                    if((a + b) % 2 == 0)
                    {
                        z = (a + b) / 2;
                        y = z - min(a, b);
                        if(z < ansZ || y < ansY)
                        {
                            ansY = y, ansZ = z;
                        }
                    }

                }
            }
            if(ansZ == INT_MAX)//有一个能求,另一个就可求
            {
                printf("IMPOSSIBLE\n");
            }
            else
                printf("%d %d\n", ansY, ansZ);
        }
        return 0;
    }

  • 相关阅读:
    Git的安装与配置
    JDBCTemplate
    消费金融大数据风控架构
    架构设计之道
    面向服务架构SOA
    java集合List解析
    web应用安全
    微服务的交互模式
    服务化管理和治理框架的技术选型
    分库分表就能无限扩容么?
  • 原文地址:https://www.cnblogs.com/cchun/p/2620887.html
Copyright © 2011-2022 走看看