USACO 3.4.3 Electric Fence (皮克定理+最大公约数)

USACO 3.4.3 Electric Fence (皮克定理+最大公约数)

皮克定理说明了其面积S和内部格点数目a、边上格点数目b的关系:S = a + b/2 - 1。

根据三角形面积公式求出S。

如果知道了b,那么三角形内部格点数目a也就求出来了。

可以证明,一条直线((0,0),(n,m))上的格点数等于n与m的最大公约数+1。即b=gcd(n,m)+1. gcd(n,m)为n与m的最大公约数。

/**/ /*
ID: lorelei3
TASK: fence9
LANG: C++
*/


#include 
< fstream >
#include 
< cmath >
#include 
< iostream >

using   namespace  std;

int  m,n,p;

int  gcd( int  a,  int  b) {
    
if(b==0return a;
    
else return gcd(b, a%b);
}


int  main() {
    
int S, a, b=0;
    ifstream fin(
"fence9.in");
    ofstream fout(
"fence9.out");

    fin
>>n>>m>>p;
    b 
+= gcd(n,m);
    b 
+= gcd(abs(n-p),m);
    b 
+= p;

    S 
= (p*m)/2;
    
//S = a + b/2 - 1;
    a = S+1-b/2;
    fout
<<a<<endl;
    
return 0;
}

代入皮克公式,即可求出a的值

你可能感兴趣的:(USACO 3.4.3 Electric Fence (皮克定理+最大公约数))