URAL 2032 - Conspiracy Theory and Rebranding【本源勾股数组】
【题意】
给出三角形的三个边长,均是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【本源勾股数组】相关推荐
- ural 2032 Conspiracy Theory and Rebranding 整点三角形
ural 2032 Conspiracy Theory and Rebranding 链接:https://vjudge.net/contest/175269#problem/I 题意:给定一个三角形 ...
- ural 2032 Conspiracy Theory and Rebranding (数学水题)
ural 2032 Conspiracy Theory and Rebranding 链接:http://acm.timus.ru/problem.aspx?space=1&num=2032 ...
- 本原勾股数组(数论日常1)
本原勾股数组 本原勾股数组(简称PPT)是一个三元组(a,b,c),其中a,b,c没有公因数,且满足 a2+b2=c2a^2+b^2=c^2a2+b2=c2 下面的定理可以求它的所有解. 勾股数组定理 ...
- java如何找出勾股数组_勾股数组 学习笔记
题目大意是给出各条边都是正整数的直角三角形的一条边长,求另外两条边可能的一种方案. 除了爆搜脑子一片空白,然后就很没志气的看了题解,提到了勾股数组,于是学习了一下.网络上的资料感觉证明不是详细,所以自 ...
- 《数论概论》读书笔记(第二章)勾股数组
本章主要讨论的是本原勾股数组,也就是关于满足a2+b2=c2a^2+b^2=c^2的三元组(a,b,c)(a,b,c),且(a,b,c)(a,b,c)互质的问题. 这章中提到一个概念:本原勾股数组(P ...
- 数论概论笔记(二)勾股数组
毕达哥拉斯定理(即勾股定理) a2+b2=c2a^2+b^2=c^2a2+b2=c2 显然勾股数组有无穷个,对存在的勾股数组每个数乘上一个正整数d即可得到新的勾股数组. 因此我们关注两两互质的三元组, ...
- 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. 只要掌握了这两 ...
- 三元二次方程式x2+y 2=z2的正整数解x、y、z称为一组勾股数,又称为毕达哥拉斯三元数组。该方程式也称为“商高方程”或“毕达哥拉斯方程”。 试通过程序设计求指定区间[a,b]内的所有勾股数组。
/*试通过程序设计求指定区间[a,b]内的所有勾股数组. 输入 输入两个正整数a, b (a<b). 输出 输出[a,b]区间内的所有勾股数组. 样例输入 30, 90 样例输出*/ #defi ...
- 数论概论 第二章 勾股数组
本章主要讨论的是勾股数组,也就是关于满足a^2+b^2=c^2的三元组(a,b,c)的问题. 其实,对于勾股数组的个数进行讨论并没有多大意义,因为已知a,b,c为勾股数组,那么显然有da,db,dc( ...
最新文章
- Jmeter入门实战(二)如何使用Jmeter的BeanShell断言,把响应数据中的JSON跟数据库中的记录对比...
- 【k-means clustering】【一】基础算法
- java薪资年龄交叉表_巧用参数实现交叉表行列互换
- 字符串处理 —— 单模式匹配
- mysql C where语句_mysql – 在WHERE子句中使用substr的SELECT语句
- Opera R3 将使用新的用户界面
- 解决cef加载flash时弹出黑框的问题
- 个人博客 修改markdown代码块背景颜色
- eclipse中文语言包安装
- 一个例子搞懂单纯形法大M法和两阶段法
- i5 8300 JAVA开发_八代标压i5-8300H和i7-8750H,哪个更值得入手?
- 不要重新发明轮子_重新发明轮子
- cad怎么画立体图形教学_cad怎么绘制三维图形,cad三维制图实例图文教程
- ASP.NET 中点击按钮时邮件自动发送功能实例
- android 添加意图,c# - Xamarin.Android:如何为每个通知添加唯一的意图 - 堆栈内存溢出...
- imac起死回生,在iMAC 27 2011 mid 上裸机安装windows10
- Linux服务篇--LAMP架构
- 商汤科技发布新一代SensePass工业级可视人脸识别门禁全新升级
- linux基础 linux命令跟踪 strace命令
- 采访Java Collection的作者Joshua Bloch
热门文章
- 女友在餐厅当传菜员,心疼她嗓子给她写了个语音转文字页面
- 4、RDA8910(4GCAT1)CSDK二次开发:期待已久的ADC采集
- 罕见、二度闯关IPO,发行人因持续经营能力存疑被否
- ORB-SLAM3 细读单目初始化过程(终结篇)
- CSS中background-attachment的介绍和用法
- python catia harness_介绍一些CATIA汽车线束设计模块的常用命令
- OC:关于Itunes你了解多少?
- 搭建gataway所遇问题及解决
- [实训题目EmoProfo]基于深度学习的表情识别服务搭建(一)
- 利用火绒安全软件修改host文件,加速访问GitHub网站