前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >勾股数组

勾股数组

作者头像
Ch_Zaqdt
发布2019-01-11 11:06:54
9730
发布2019-01-11 11:06:54
举报
文章被收录于专栏:Zaqdt_ACM

      一般地,若三角形三边长a,b,c都是正整数,且满足a,b的平方和等于c的平方,那么数组(a,b,c)称为勾股数组。勾股数组是人们为了解出满足勾股定理的不定方程的所有整数解而创造的概念。       再来看下面这些勾股数:(3,4,5),(5,12,13),(7,24,25),(9,40,41),(11,60,61)…这些勾股数都是以奇数为一边构成的直角三角形。由以上已知任意一个大于2的偶数可以构成一组勾股数,实际上以任意一个大于1的奇数2n+1(n>1)为边也可以构成勾股数,其三边分别是2n+1、2n^2+2n、2n^2+2n+1,这可以通过勾股定理的逆定理获证。                                                                                                                                         ———以上来自百度百科


      由以上已知任意一个大于2的偶数可以构成一组勾股数,实际上以任意一个大于1的奇数2n+1(n>1)为边也可以构成勾股数,其三边分别是2n+1、2n^2+2n、2n^2+2n+1,这可以通过勾股定理的逆定理获证。        上面这句话是重点句,也就是说,我们只要能得到一个大于2的数,就可以得到一个勾股数组。下面用一道题来练习一下(2018中国大学生程序设计竞赛 - 网络选拔赛的1004题) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6441

Find Integer

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 6597    Accepted Submission(s): 1852 Special Judge

Problem Description

people in USSS love math very much, and there is a famous math problem . give you two integers nnn,aaa,you are required to find 222 integers bbb,ccc such that anana^{n}+bn=cnbn=cnb^{n} = c^{n} .

Input

one line contains one integer TTT;(1≤T≤1000000)(1≤T≤1000000)(1 \le T\le1000000) next TTT lines contains two integers nnn,aaa;(0≤n≤1000(0≤n≤1000(0 \le n \le1000,000000000,000,3≤a≤40000)000,3≤a≤40000)000,3 \le a \le 40000)

Output

print two integers bbb,ccc if bbb,ccc exits;(1≤b,c≤1000(1≤b,c≤1000(1 \le b,c \le 1000,000000000,000)000)000); else print two integers -1 -1 instead.

Sample Input

代码语言:javascript
复制
1
2 3

Sample Output

代码语言:javascript
复制
4 5

      这道题的题意是有一个公式a^n + b^n = c^n,输入n和a,然后求出b和c的值,没有的话输出-1 -1。首先由费马大定理可得当n大于2的时候是无解的,所以我们只需要去讨论当n等于0、1、2这三种情况就好了,当n等于0的时候易知无解,当n等于1的时候我们只需要输出1 a+1就好了。当n等于2的时候就是上面所说的要去求一个勾股数组,当a为奇数有勾股数(2*a+1,2*a*a+2*a,a*a+1);当a为偶数有勾股数(2*a,a*a-1,a*a+1)。


AC代码:

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
int T,n,a;

int main()
{
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&a);
                if(n > 2 || n == 0){
                printf("-1 -1\n");
            }
            else if(n == 1){
                printf("1 %d\n",a + 1);
            }
            else if(n == 2){
                if(a % 2 == 1){
                    int ans = (a - 1) / 2;
                    printf("%d %d\n",ans * ans + (ans+1) * (ans+1) - 1,ans * ans + (ans+1) * (ans+1));
                }
                else{
                    int ans = (a + 2) / 2;
                    printf("%d %d\n",(ans - 1) * (ans - 1) - 1,(ans-1) * (ans-1) + 1);
                }
            }
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年08月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Find Integer
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档