【牛客练习赛51】C - 勾股定理【数学】
题目大意:
题目链接:https://ac.nowcoder.com/acm/contest/1083/C
给出直角三角形其中一条边的长度,你的任务是构造剩下的两条边,使这三条边能构成一个直角三角形。
思路:
分类讨论。
- 如果,显然无解。
- 如果是奇数,那么显然存在,这样。这样就构造出了一组勾股数。
- 如果是偶数,那么就把写成,其中为奇数。
- 如果,那么就直接按照奇数的方法计算出另外两个数字,然后全部乘上。
- 如果,那么就是。这样的话我们就另,显然不会是小数。那么利用勾股数,答案就是。
好像是有通项公式的,但是我太菜了不会
代码:
#include <cstdio>
using namespace std;
typedef long long ll;
int a,b;
ll p;
int main()
{
scanf("%d",&a);
if (a==1 || a==2 || a==0)
return !printf("-1");
if (a&1) //奇数
return !printf("%lld %lld",(ll)a*(ll)a/2LL,(ll)a*(ll)a/2LL+1LL);
for (p=1,b=a;!(b&1);b/=2,p*=2LL) ; //计算k
if (b!=1) //可以转换成某个不为1的奇数
printf("%lld %lld",(ll)b*(ll)b/2LL*p,((ll)b*(ll)b/2LL+1LL)*p);
else //为2^t
printf("%lld %lld",3LL*(a/4),5LL*(a/4));
return 0;
}