cf1058d 几何 网格三角形

题目:给定n,m,k  判断是否存在三角形 三点在端点 且(0<=x<=n ,0<=y<=m),面积 = n*m/k

http://codeforces.com/contest/1058/problem/D

思路:很容易知道 在网格上的三角形 ,面积*2是整数,所以n*m*2%k!=0 就是no

  所以可以把一个点放在原点 a*b/2 =  n*m/k   也就是 ab = 2nm/k

  这种求出个特解(a,0) (0,b) ,利用gcd

  如果 gcd(2n,k) >=2      a = 2*n/gcd(2ll*n,k) , 则 a<=n, b= 2nm/k/a = m/ k/gcd..  ,b<=m成立

  如果gcd(2n,k)==1 ,很明显 ,gcd(2m,k) >=2(因为有因子啊)  

#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define pb push_back
#define fi first
#define se second
#define all(v) v.begin(),v.end()

const int N = 1e5+4;
const int INF =1E9+4;
const ll mod =1e9+7;

ll gcd(ll a,ll b){
    return b==0?a : gcd(b,a%b);
}
int main(){

    ll n,m,k;

    cin>>n>>m>>k;

    if(2ll*m*n % k!=0){

        puts("NO");return 0;
    }
    puts("YES");
    ll a,b;

    if(gcd(2ll*n,k)>=2){
        a = 2*n/gcd(2ll*n,k);
        b = n*m*2/a/k;
    }
    else {
        b = 2*m/gcd(m*2,k);
        a = n*m*2/k/b;
    }

    printf("0 0\n0 %lld\n%lld 0\n",b,a);

    return 0;
}

 

posted on 2018-10-05 14:57  Helpp  阅读(275)  评论(0)    收藏  举报

导航