zoukankan      html  css  js  c++  java
  • 洛谷P2735 电网 Electric Fences

    P2735 电网 Electric Fences

      • 11通过
      • 28提交
    • 题目提供者该用户不存在
    • 标签USACO
    • 难度普及/提高-

      讨论  题解  

    最新讨论

    • 暂时没有讨论

    题目描述

    在本题中,格点是指横纵坐标皆为整数的点。

    为了圈养他的牛,农夫约翰(Farmer John)建造了一个三角形的电网。他从原点(0,0)牵出一根通电的电线,连接格点(n,m)(0<=n<32000,0<m<32000),再连接格点(p,0)(p>0),最后回到原点。

    牛可以在不碰到电网的情况下被放到电网内部的每一个格点上(十分瘦的牛)。如果一个格点碰到了电网,牛绝对不可以被放到该格点之上(或许Farmer John会有一些收获)。那么有多少头牛可以被放到农夫约翰的电网中去呢?

    输入输出格式

    输入格式:

    输入文件只有一行,包含三个用空格隔开的整数:n,m和p。

    输出格式:

    输出文件只有一行,包含一个整数,代表能被指定的电网包含的牛的数目。

    输入输出样例

    输入样例#1:
    7 5 10
    输出样例#1:
    20

    说明

    题目翻译来自NOCOW。

    USACO Training Section 3.4

    分析:其实就是求三角形内的格点数目?这样的话可以用一个高大上的皮克定理:传送门,面积可以直接计算出来,那么问题就是线段上的格点怎么算呢?可以看作是一个一次函数,那么线段(a,b)-(c,d)上的格点数目等于gcd(abs(a -  c),abs(b - d))+1,套用皮克公式计算即可.

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int n, m, p,s,b;
    
    int gcd(int a, int b)
    {
        if (!b)
            return a;
        return gcd(b, a % b);
    }
    
    int main()
    {
        scanf("%d%d%d", &n, &m, &p);
        b = gcd(n, m) + gcd(abs(p - n), m) + p;
        s = p * m / 2;
        printf("%d
    ", s - b / 2 + 1);
    
        return 0;
    }
  • 相关阅读:
    Java操作Redis的方式
    Redis综述
    KafKa综述
    NuxtJS项目——状态树
    NuxtJS项目——开发工具
    NuxtJS项目——命令和部署
    NuxtJS项目——模块
    NuxtJS项目——插件
    NuxtJS项目——资源文件
    Sampling Matrix
  • 原文地址:https://www.cnblogs.com/zbtrs/p/5964862.html
Copyright © 2011-2022 走看看