在这个问题中,平面中的“晶格点”是具有整数坐标的点。
为了控制牛,农夫约翰通过在原点(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;