ecnu 3619 math
Posted taming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ecnu 3619 math相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h> using namespace std; /* * 即s=a*b 可以想象s=1和s=2的情况是无解的 * 显然当s不是素数的时候一定有解 s=a*b a<b的话a作底b作高 随意找点锐角点即可 * 当s是素数时 有解的话只有一种情形 s=p*sqrt(u)*sqrt(u) u=a^2+b^2 * 设三角形底边两端点为ax+by=ab与坐标轴的交点 * 则是否有解变成了与该直线平行且距离为n/sqrt(a*a+b*b)的直线是否有整点解 * 通过平行直线只间距离公式化简得另外一条直线为ax+by=n+ab 当然也可以是ab-n * 通过拓展欧几里得可知 (n+ab) mod gcd(a,b)=0的话一定有整数解 * 令a,b中的一个为1 则gcd(a,b)=1 则(n+ab) mod 1=0说明一定有整点解 * 则问题的关键变成了是否是锐角三角形 这里假设b=1 a>=1 * ax+y=a与x轴交点为(1,0) 过该点垂直ax+y=a的直线为x-ay=1 * x-ay=1和ax+y=a+n解得x=a*n/(a*a+1)+1 若a*n mod a*a+1 = 0 * 此时是无解的 只能考虑别的a 这里选则a++ * 若取余不为0 则说明在该交点往上sqrt(a*a+1)的距离内有一个整点解 * 因为直线上ax+y=a+n上整点的间隔距离为sqrt(a*a+1) 若交点是整点就只能得到直角三角形或者钝角三角形 * 反之则一个解的x坐标就是a*n/(a*a+1)+1向下取整 接下来算出对应的y即可 */ int main(){ long long n; cin>>n; long long l=2; if(n==1||n==2){ cout<<"No"; return 0; } while(l*l<=n){ //判断是否是素数 if(n%l==0){ cout<<"Yes"<<endl; cout<<"0 0"<<endl; cout<<l<<" 0"<<endl; cout<<"1 "<<n/l; return 0; } else l++; } long long x,y,a; for(a=1;a*a<n;a++){ if(a*n%(a*a+1)!=0){ x=a*n/(a*a+1)+1; y=a+n-a*x; cout<<"Yes"<<endl; cout<<"1 0"<<endl<<"0 "<<a<<endl<<x<<‘ ‘<<y; return 0; } } }
以上是关于ecnu 3619 math的主要内容,如果未能解决你的问题,请参考以下文章