Electric Fence

描述

在本题中,格点是指横纵坐标皆为整数的点。
为了圈养他的牛,农夫约翰建造了一个三角形的电网。他从原点(0,0)牵出一根通电的电线,连接格点[n,m](0<n,m<32000),再连接格点[p,0](p>0),最后回到原点。
牛可以在不碰到电网的情况下被放到电网内部的每一个格点上(十分苗条的牛)。如果一个格点碰到了电网,牛绝对不可以被放到该格点之上。那么有多少头牛可以被放到农夫约翰的电网中去呢?

输入

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

输出

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

样例输入

7 5 10

样例输出

20

 

哈哈。很有意思的题。各种方法都可以水。

比如用 平行x轴的直线去切。什么的。

有人用了个叫什么pick定理的似乎很有意思。

 

PICK定理:

这个公式是皮克(Pick)在1899年给出的,被称为“皮克定理”,这是一个 实用而有趣的定理。
给定顶点坐标均是整点(或正方形格点)的简单多边形,皮克定理说明了其面积S和内部格点数目n、边上格点数目s的 关系:
(其中n表示多边形 内部的点数,s表示多边形 边界上的 点数,S表示多边形的面积)
 
此题中 可以列出  
n + s/2 - 1 = p*y/2 
写成n=....
就完了.
 
代码:
/*
      ID: Andy Chen
      LANG: C++
      TASK: fence9
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int gcd(int a,int b)
{
    return b == 0?a:gcd(b,a%b);
}
int main()
{
    int x,y,p;
    int a,s,b;
    freopen("fence9.in","r",stdin);
    freopen("fence9.out","w",stdout);
    scanf("%d%d%d",&x,&y,&p);
    s = p*y;
    b = gcd(x,y)+p;
    b += gcd(fabs(p-x),y);
    a = (s+2-b)/2;
    printf("%d\n",a);
    return 0;
}

 

你可能感兴趣的:(Electric Fence)