【题意】

给出三角形的三个边长,均是10^7以内的整数,问三角形的三个角的坐标是否能均是整数,输出其中任意一个解。

【题解】

一开始想的是枚举一条边的横坐标,然后通过勾股定理以及算角度求出其他点的坐标,再判断是否符合条件。

亲测TLE

直到知道了本源勾股数组的构造方法。。。

每个本源勾股数组(a,b,c)满足a*a+b*b=c*c,其中a为奇数,b为偶数。。

枚举s,t(1<=t<s,且它们是没有公因数的奇数)

a=st  b=(s*s-t*t)/2  c=(s*s+t*t)/2

因为最大数c=(s*s+t*t)/2  所以最多枚举到sqrt(2*c)即可。

假设三角形的三个点分别为p,q和r

我们先固定一个点为p(0,0),另外一个点q与它的距离是x,还有一个点r与它的距离是y。那么q的距离与r的距离一定是z

我们枚举勾股数组,如果勾股数组(a1,b1,c1)的c1,也就是最大的那个数,等于x,那么x的坐标为(a1,b1)【当然也可以是(a1,-b1),(-a1,b1),(-a1,-b1),均需要枚举,下同】

然后枚举c等于y的勾股数组,(a2,b2,c2),那么r点坐标为(a2,b2) 【可以事先把这些坐标预处理出来,放入vector中】

接下来判断两坐标是否相距为z即可。

注意通过这种方法求出来的勾股数组的a是奇数,也就是说它们的倍数 (i*a,i*b,i*c),i是一个正整数,并不会被求出来,我们要求的是i*c==x,那么只要满足x mod c=0我们就可以把勾股数组乘以x/c,加入备选选项中。

注意(0,x) (0,-x) (x,0) (-x,0)以及(0,y) (0,-y) (y,0) (-y,0) 不会在枚举本源勾股数组中出现,所以需要自己手动判断。

#include<bits/stdc++.h>
#define eps 1e-9
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define MAXN 1005
#define MAXM 40005
#define INF 0x3fffffff
#define PB push_back
#define MP make_pair
#define X first
#define Y second
#define lc (k<<1)
#define rc ((k<<1)1)
using namespace std;
typedef long long LL;
LL i,j,k,n,m,x,y,T,ans,big,cas,num,len;
bool flag;
LL z;
LL mx,sum,a,b,c;
vector <pair<LL,LL> > xx,yy;LL gcd(LL x, LL y)
{return y ? gcd(y, x % y) : x;
}int main()
{scanf("%I64d%I64d%I64d",&x,&y,&z);if (x>y) swap(x,y);if (y>z) swap(y,z);if (x>y) swap(x,y);mx=(LL)(sqrt(2*z)+eps);for (i=1;i<=mx;i+=2)//枚举本源勾股数组{for (j=i+2;j<=mx;j+=2){if (gcd(i,j)>1) continue;a=i*j;b=(j*j-i*i)/2;c=(j*j+i*i)/2;if (x%c==0){xx.PB(MP(a*x/c,b*x/c));xx.PB(MP(a*x/c,-b*x/c));xx.PB(MP(-a*x/c,b*x/c));xx.PB(MP(-a*x/c,-b*x/c));xx.PB(MP(b*x/c,a*x/c));xx.PB(MP(b*x/c,-a*x/c));xx.PB(MP(-b*x/c,a*x/c));xx.PB(MP(-b*x/c,-a*x/c));}if (y%c==0) {yy.PB(MP(a*y/c,b*y/c));yy.PB(MP(a*y/c,-b*y/c));yy.PB(MP(-a*y/c,b*y/c));yy.PB(MP(-a*y/c,-b*y/c));yy.PB(MP(b*y/c,a*y/c));yy.PB(MP(b*y/c,-a*y/c));yy.PB(MP(-b*y/c,a*y/c));yy.PB(MP(-b*y/c,-a*y/c));}}}xx.PB(MP(0,x));xx.PB(MP(x,0));xx.PB(MP(0,-x));xx.PB(MP(-x,0));yy.PB(MP(0,y));yy.PB(MP(y,0));yy.PB(MP(0,-y));yy.PB(MP(-y,0));for (i=0;i<xx.size();i++){for (j=0;j<yy.size();j++){if ((xx[i].X-yy[j].X)*(xx[i].X-yy[j].X)+(xx[i].Y-yy[j].Y)*(xx[i].Y-yy[j].Y)==z*z){printf("0 0\n%I64d %I64d\n%I64d %I64d\n",xx[i].X,xx[i].Y,yy[j].X,yy[j].Y);return 0;}}}printf("-1\n");return 0;
}

转载于:https://www.cnblogs.com/zhyfzy/p/4491963.html

URAL 2032 - Conspiracy Theory and Rebranding【本源勾股数组】相关推荐

  1. ural 2032 Conspiracy Theory and Rebranding 整点三角形

    ural 2032 Conspiracy Theory and Rebranding 链接:https://vjudge.net/contest/175269#problem/I 题意:给定一个三角形 ...

  2. ural 2032 Conspiracy Theory and Rebranding (数学水题)

    ural 2032  Conspiracy Theory and Rebranding 链接:http://acm.timus.ru/problem.aspx?space=1&num=2032 ...

  3. 本原勾股数组(数论日常1)

    本原勾股数组 本原勾股数组(简称PPT)是一个三元组(a,b,c),其中a,b,c没有公因数,且满足 a2+b2=c2a^2+b^2=c^2a2+b2=c2 下面的定理可以求它的所有解. 勾股数组定理 ...

  4. java如何找出勾股数组_勾股数组 学习笔记

    题目大意是给出各条边都是正整数的直角三角形的一条边长,求另外两条边可能的一种方案. 除了爆搜脑子一片空白,然后就很没志气的看了题解,提到了勾股数组,于是学习了一下.网络上的资料感觉证明不是详细,所以自 ...

  5. 《数论概论》读书笔记(第二章)勾股数组

    本章主要讨论的是本原勾股数组,也就是关于满足a2+b2=c2a^2+b^2=c^2的三元组(a,b,c)(a,b,c),且(a,b,c)(a,b,c)互质的问题. 这章中提到一个概念:本原勾股数组(P ...

  6. 数论概论笔记(二)勾股数组

    毕达哥拉斯定理(即勾股定理) a2+b2=c2a^2+b^2=c^2a2+b2=c2 显然勾股数组有无穷个,对存在的勾股数组每个数乘上一个正整数d即可得到新的勾股数组. 因此我们关注两两互质的三元组, ...

  7. matlab毕达哥拉斯质数,“毕达哥拉斯-史仲夏”常用勾股数组表

    毕达哥拉斯方程:(2uv)^2+(u^2-v^2)^2=(u^2+v^2)^2 求证勾股数组的规律: 1.uv=质数:只有一组勾股数组. 2.u^2+v^2=u^2-v^2+2v^2. 只要掌握了这两 ...

  8. 三元二次方程式x2+y 2=z2的正整数解x、y、z称为一组勾股数,又称为毕达哥拉斯三元数组。该方程式也称为“商高方程”或“毕达哥拉斯方程”。 试通过程序设计求指定区间[a,b]内的所有勾股数组。

    /*试通过程序设计求指定区间[a,b]内的所有勾股数组. 输入 输入两个正整数a, b (a<b). 输出 输出[a,b]区间内的所有勾股数组. 样例输入 30, 90 样例输出*/ #defi ...

  9. 数论概论 第二章 勾股数组

    本章主要讨论的是勾股数组,也就是关于满足a^2+b^2=c^2的三元组(a,b,c)的问题. 其实,对于勾股数组的个数进行讨论并没有多大意义,因为已知a,b,c为勾股数组,那么显然有da,db,dc( ...

最新文章

  1. Jmeter入门实战(二)如何使用Jmeter的BeanShell断言,把响应数据中的JSON跟数据库中的记录对比...
  2. 【k-means clustering】【一】基础算法
  3. java薪资年龄交叉表_巧用参数实现交叉表行列互换
  4. 字符串处理 —— 单模式匹配
  5. mysql C where语句_mysql – 在WHERE子句中使用substr的SELECT语句
  6. Opera R3 将使用新的用户界面
  7. 解决cef加载flash时弹出黑框的问题
  8. 个人博客 修改markdown代码块背景颜色
  9. eclipse中文语言包安装
  10. 一个例子搞懂单纯形法大M法和两阶段法
  11. i5 8300 JAVA开发_八代标压i5-8300H和i7-8750H,哪个更值得入手?
  12. 不要重新发明轮子_重新发明轮子
  13. cad怎么画立体图形教学_cad怎么绘制三维图形,cad三维制图实例图文教程
  14. ASP.NET 中点击按钮时邮件自动发送功能实例
  15. android 添加意图,c# - Xamarin.Android:如何为每个通知添加唯一的意图 - 堆栈内存溢出...
  16. imac起死回生,在iMAC 27 2011 mid 上裸机安装windows10
  17. Linux服务篇--LAMP架构
  18. 商汤科技发布新一代SensePass工业级可视人脸识别门禁全新升级
  19. linux基础 linux命令跟踪 strace命令
  20. 采访Java Collection的作者Joshua Bloch

热门文章

  1. 女友在餐厅当传菜员,心疼她嗓子给她写了个语音转文字页面
  2. 4、RDA8910(4GCAT1)CSDK二次开发:期待已久的ADC采集
  3. 罕见、二度闯关IPO,发行人因持续经营能力存疑被否
  4. ORB-SLAM3 细读单目初始化过程(终结篇)
  5. CSS中background-attachment的介绍和用法
  6. python catia harness_介绍一些CATIA汽车线束设计模块的常用命令
  7. OC:关于Itunes你了解多少?
  8. 搭建gataway所遇问题及解决
  9. [实训题目EmoProfo]基于深度学习的表情识别服务搭建(一)
  10. 利用火绒安全软件修改host文件,加速访问GitHub网站