| 题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
|---|---|---|---|---|---|
| Triangle | ★☆☆☆☆ | 答案正确 | 100 | 2015-02-24 15:46:16 | 没看清题目(0) |
给出两条边长a,b,问能否用这两条边构造直角三角形,三个顶点坐标值都为整数,且三条边不和坐标轴平行。
好吧,第一次交的时候没看见是直角三角形……
| 407A.cpp代码已折叠
展开折叠内容
|
|---|
#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#define sqr(x) ((x)*(x))
#define dsi(n) int n;scanf("%d",&n)
#define si(n) scanf("%d",&n)
#define f(i,n) for(int i=1;i<=n;++i)
#define fi(n) f(i,n)
#define f0(i,n) for(int i=0;i!=n;++i)
#define fd(i,n) for(int i=n;i>=1;--i)
#define ci const int&
#define foreach(i,s) for(typeof(s.begin()) i=s.begin();i!=s.end();++i)
std::set< std::pair<int,int> > t,p;
int getl(std::pair<int,int> a)
{
return a.first*a.first+a.second*a.second;
}
bool isRight(std::pair<int,int> a,std::pair<int,int> b)
{
std::pair<int,int> c=std::make_pair(a.first+b.first,a.second-b.second);
int la=getl(a),lb=getl(b),lc=getl(c);
return la+lb==lc||la+lc==lb||lb+lc==la;
}
int main()
{
dsi(a);dsi(b);
fi(a*a-1)
if(sqr(round(sqrt(i)))==i&&sqr(round(sqrt(a*a-i)))==a*a-i)
t.insert(std::make_pair(round(sqrt(i)),round(sqrt(a*a-i))));
fi(b*b-1)
if(sqr(round(sqrt(i)))==i&&sqr(round(sqrt(b*b-i)))==b*b-i)
p.insert(std::make_pair(round(sqrt(i)),round(sqrt(b*b-i))));
//std::cout<<t.size();
foreach(i,t)
{
foreach(j,p)
{
if(i->second!=j->second&&isRight(*i,*j))
{
std::cout<<"YES\n"<<"0 0\n"<<i->first<<" "<<i->second<<"\n"<<-j->first<<" "<<j->second;
return 0;
}
}
}
std::cout<<"NO";
return 0;
}
|