【数学】电子围栏

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

为了控制牛,农夫约翰通过在原点(0,0)到晶格点[n,m]上串起一根“热”线,构造了三角形的电围栏(0 <=; n <32,000,0 <m <32,000),然后到正x轴[p,0]上的晶格点(0 <p <32,000),然后回到原点(0,0)。

可以将母牛放在栅栏内的每个格子点上,而不会碰到栅栏(非常瘦的母牛)。不能将母牛放在栅栏接触的格子点上。给定的围栏可以容纳几头母牛?

#include<bits/stdc++.h>
using namespace std;
/*bool check(int x,int y,int xx,int yy,int x1,int y1,int x2,int y2)
{
    int dx1=x2-x1,dy1=y2-y1;
    int dx=x-x1,dy=y-y1;
    int dxx=xx-x1,dyy=yy-y1;
    int tmp=dxx*dy1-dyy*dx1;
    return (dx*dy1-dy*dx1>=0)==(tmp>0);
}*/
int gcd(int x,int y)
{
    if (!y)
        return x;
    return gcd(y,x%y);
}
int main()
{
    int n,m,p;
    scanf("%d%d%d",&n,&m,&p);
    int s,num,t=0;
    /*int r;
    if (p>n) r=p;
    else r=n;
    for (int i=1;i<=r;i++)
      for (int j=1;j<=m;j++)
        if (check(i,j,0,0,n,m,p,0)&&check(i,j,n,m,0,0,p,0)&&check(i,j,p,0,n,m,0,0))
        {
          t++;
        }
        else
            break;*/
    s=p*m/2;
    int a=gcd(m,n);
    int b=gcd(m,abs(p-n));
    t=s-(p+a+b)/2+1;
    printf("%d\n",t);
    return 0;
}

代码分析:问题转化为皮克定理的运用,纯模拟的话时间复杂度过高。

皮克定理 三角形内点=三角形面积-(三角形边界整点/2)+1;

发布了40 篇原创文章 · 获赞 0 · 访问量 700

猜你喜欢

转载自blog.csdn.net/Skynamer/article/details/101104681