当前位置: 首页 > news >正文

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

相关文章:

  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之89——BREW中的测试工具...
  • uva 571 素数的性质
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之90——BREW中的调试信息...
  • C++中static用法
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之90——BREW中的日志接口功能...
  • cmd 控制台 提示:请求的操作须要提升!
  • eclipse-ADT安装失败经验
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之91——BREW手机中的调试模式...
  • 团队冲刺-2
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之91——BREW debuger的使用...
  • [整理]Svn常见问题汇总。
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之92——BREW中的Perl 接口使用...
  • 修改Eclipse/MyEclipse项目的默认编码(转)
  • 微软等数据结构+算法面试100题,为什么会这样火?
  • Ajax--WebService返回List
  • 分享的文章《人生如棋》
  • canvas 高仿 Apple Watch 表盘
  • es6要点
  • github从入门到放弃(1)
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • mysql常用命令汇总
  • NSTimer学习笔记
  • Vue 动态创建 component
  • Vue2.0 实现互斥
  • 创建一种深思熟虑的文化
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 关于List、List?、ListObject的区别
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 巧用 TypeScript (一)
  • 如何解决微信端直接跳WAP端
  • 突破自己的技术思维
  • 我感觉这是史上最牛的防sql注入方法类
  • 小程序 setData 学问多
  • 小而合理的前端理论:rscss和rsjs
  • ionic异常记录
  • Java总结 - String - 这篇请使劲喷我
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (39)STM32——FLASH闪存
  • (70min)字节暑假实习二面(已挂)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (poj1.3.2)1791(构造法模拟)
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (接口自动化)Python3操作MySQL数据库
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (三)elasticsearch 源码之启动流程分析
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • ***利用Ms05002溢出找“肉鸡