码迷,mamicode.com
首页 > 其他好文 > 详细

ecnu 3619 math

时间:2018-08-03 14:29:38      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:clu   ret   有一个   情况   namespace   its   欧几里得   lse   端点   

#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

标签:clu   ret   有一个   情况   namespace   its   欧几里得   lse   端点   

原文地址:https://www.cnblogs.com/TAMING/p/9413311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!