电子围栏(皮克定理)

描述

在这个问题中,平面中的“格点”是具有整数坐标的点。

为了容纳他的奶牛,农夫约翰建造了一个三角形的电栅栏,将一根“热”线从原点(0,0)串到晶格点[n,m](0<=n<32,000,0<m<32,000),然后到正x轴[p,0](0<p<32,000)上的晶格点,然后回到原点(0,0)。

可以在围栏内的每个格子点放置一头牛,而无需接触围栏(非常薄的奶牛)。奶牛不能放在栅栏接触的格子点上。一个给定的围栏可以容纳多少头奶牛?

输入
 

单个输入行包含三个空格分隔的整数,分别表示 n、m 和 p。

输出

带有单个整数的单行,表示指定的围栏可以容纳的奶牛数量。

样例输入

7 5 10

样例输出

20

题解

本题给出一个三角形需要我们求出不包括边缘的三角形内部所有整点数。这里可以用到皮克定理, S=n1/2+n2-1(S为三角形面积,n1为边上整点个数,n2为内部整点个数)。这个定理大家可以去搜一下,知乎的证明很详细。我们知道这个公式后问题也就变成了已知三点求三角形面积与边上整点个数。由于已知图形的一条边以及对应的高所以面积易得。然后就是求线上整点个数,也就是求ax+by=c的整数解,这时需要用到欧几里德算法,最后带入公式就可以求得答案了。

#include<bits/stdc++.h>
using namespace std;
int gcd(int x,int y)
{
    if(y==0)return x;
    else
        return gcd(y,x%y);
}
int main ()
{
    int n,m,p;
    cin>>n>>m>>p;

    int s=p*m/2;
    int l1=gcd(n,m);
    int l2=gcd(p,0);
    int l3=gcd(abs(n-p),m);
    printf("%d\n",s-(l1+l2+l3)/2+1);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值