Codeforces Round #512 (Div. 2) D. Vasya and Triangle

参考了别人的思路:https://blog.csdn.net/qq_41608020/article/details/82827632

         http://www.cnblogs.com/qywhy/p/9695344.html

首先根据皮克定理,2*m*n/k一定要是一个整数,也就是说2*m*n%k !=0 的都可以不用算了

最简单的构造方法肯定是 (a,0),(0,b)

2*n*m%k ==0,把2*n*m看成2*n和m两部分,k中的质因子,一部分在2*n中,一部分在m中,当然这个“一部分”可以是0    

例子:2*3*5%15 == 0   k的质因子分别来自n和m

当k和2*n含有相同的质因子时

令t=gcd(2*n,k)   t一定大于等于2

令a = 2n/t     a一定小于n

b = (2*m*n)/(a*k)

b=m*t/k     b一定小于等于m(因为t一定大于等于k)

当k和2*n不含相同质因子时

那么质因子就全部包含在m里面

直接令a = n   b = 2*m/k 即可   因为k >= 2  所以不会超范围

ac:代码  

#include<bits/stdc++.h>
using namespace std;
#define ll long long
long long n,m,k;
ll gcd(ll a,ll b)
{
    if (b==0) return a;
    return gcd(b,a%b);
}
int main()
{
    scanf("%lld%lld%lld",&n,&m,&k);
    if (n*m*2%k!=0)
    {
        printf("NO");
        return 0;
    }
    printf("YES
0 0
");
    long long g = gcd(2*n,k);
    if(g == 1)
    {
        ll a = n;
        ll b = 2*m/k;
        printf("%lld 0
",a);
        printf("0 %lld
",b);
    }
    else
    {
        ll a = 2*n/g;
        ll b = m*g/k;
        printf("%lld 0
",a);
        printf("0 %lld
",b);
    }
}

  

原文地址:https://www.cnblogs.com/mltang/p/9700167.html