zoukankan      html  css  js  c++  java
  • codeforces 1030D Vasya and Triangle【思维+gcd】

    题目:戳这里

    题意:选出三个点构成三角形,要求面积为n*m/k。

    解题思路:因为三个点的坐标都是正整数,根据三角形面积公式(x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))/2=n*m/k可知,若三角形存在,则2*n*m/k必为整数。若面积*2为整数,则把该三角形放置在x轴上即可。于是设x1=0,y1=0,x2=a,y2=0,x3=0,y3=b;求a*b=2*n*m/k。(0<=a<=n,0<=b<=m)

    欲找到满足条件,可以利用最大公约数。若gcd(2*n,k)==1,则gcd(2*m,k)>=2; b=2*m/gcd(2*m,k) <=m,a=n/(k/gcd(2*m,k)<=n,反之若gcd(2*n,k)>=2同理。

    附ac代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int inf = 0x3f3f3f3f;
     5 const int maxn = 2e3 + 10;
     6 #define lowbit(x) x&-x
     7 ll gcd(ll a, ll b) {
     8     return b?gcd(b,a%b):a;
     9 }
    10 int main() {
    11     ll n, m, k;
    12     scanf("%lld %lld %lld", &n, &m, &k);
    13     if(2ll * n * m %k != 0) {
    14         puts("NO");
    15         return 0;
    16     }
    17     puts("YES");
    18     puts("0 0");
    19     ll x2, y2, x3, y3;
    20     ll sum = 2ll * n * m / k;
    21  //   printf("%lld
    ", gcd(2ll*n,k));
    22     if(gcd(2ll*n,k) == 1) {
    23         ll u = gcd(2ll*m, k);
    24         printf("%lld %lld
    %lld %lld", n/(k/u), 0ll, 0ll, 2ll*m/u);
    25     } else {
    26         ll u = gcd(2ll*n, k);
    27         printf("%lld %lld
    %lld %lld", 2ll*n/u, 0ll, 0ll, m/(k/u));
    28     }
    29     return 0;
    30 }
    View Code
  • 相关阅读:
    延迟为程序集签名
    bootshrap会改变IE浏览器滚动条样式
    Spark算子选择策略
    kafka常用系统命令-1
    数据结构-树
    1.PyCharm 用法
    sql 语句用法
    linux命令
    linux命令
    es的相关知识二(检索文档)
  • 原文地址:https://www.cnblogs.com/zmin/p/9928890.html
Copyright © 2011-2022 走看看