Vasya and Triangle CodeForces - 1030D

原题链接
考察:思维,数论
思路:
  先考虑依据矩形边建立三角形.
(1) k==1 明显不成立
(2) \(n\)\(k\)的倍数,明显\((0,0),(0,\frac{2n}{k})(m,0)\)
(3) \(m\)\(k\)的倍数,明显\((0,0),(0,n),(\frac{2m}{k},0)\)
(4) \(S = \frac{ah}{2} = \frac{nm}{k}\),如果\(2nm\)不能整除\(k\),则输出NO.依照前面,\(n,m\)都不能整除\(k\).此时只考虑构造直角三角形.那么 \(a*b = \frac{2nm}{k}\),需要将\(a\)的范围压到\(n\),可以发现在前面的前提下,\(t = gcd(k,2n)>=2\),所以\(a = \frac{2n}{t},b = \frac{tm}{k}\)

Code

#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
int n, m, k;
int gcd(int a,int b)
{
    return b ? gcd(b, a % b) : a;
}
bool check()
{
    if(2ll*n*m%k!=0||k==1)
        return 0;
    if(m%k==0)
    {
    	int t = gcd(2 * m, k);
    	puts("YES");
    	printf("0 0\n0 %d\n%d 0\n",n,2 * m/ k);
    	return 1;
	}
    int t = gcd(2 * n, k);
    puts("YES");
    printf("0 0\n0 %lld\n%lld 0\n", 2ll * n / t,(LL)t * m / k);
    return 1;
}
int main()
{
    scanf("%d%d%d", &m, &n, &k);
    if(!check())
        puts("NO");
    return 0;
}

posted @ 2021-07-08 21:51  acmloser  阅读(23)  评论(0编辑  收藏  举报