USACO 3.4 Electric Fences电网 (数学.皮克定理)

题目大意:求一个三角形(0,0)、(p,0)、(n,m)内有多少个坐标为整数的点。

方法:这题要用到皮克定理(这名字一听就n高级,要是那天弄出个mw定理我就死而无憾了),介绍了多边形面积S与内部顶点数a和边上顶点数b的关系S=a+b/2-1,证明的话自己百度去(谷歌也可以)。S用矢量叉积求;至于b的话,可以证明一条线段((0,0),(n,m))上的格点数等于n与m的最大公约数+1,一条线段((p,0),(n,m))上的格点数等于n-p与m的最大公约数+1。接着套上皮克定理就好了。

下面附程序:

var
  n,m,p,b:longint;
  s:real;

function gcd(x,y:longint):longint;
begin
  if y=0 then exit(x);
  if x mod y=0 then exit(y);
  gcd:=gcd(y,x mod y);
end;

function max(x,y:longint):longint;
begin
  if x>y then exit(x)
         else exit(y);
end;

function min(x,y:longint):longint;
begin
  if x<y then exit(x)
         else exit(y);
end;

begin
  readln(n,m,p);
  s:=m*p/2;
  b:=gcd(max(n,m),min(n,m))+p+gcd(max(m,abs(n-p)),min(m,abs(n-p)));
  writeln(s-b/2+1:0:0);
end.


你可能感兴趣的:(USACO 3.4 Electric Fences电网 (数学.皮克定理))