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的主要内容,如果未能解决你的问题,请参考以下文章

ECNU620数学题(结论题)

实用代码片段

在ECNU校园网内搭建反向代理

ecnu 2851 Easy

ecnu 2957 Easy

ecnu 3025