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;
}

 

转载于:https://www.cnblogs.com/wjhstudy/p/9744845.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值