题意:
已知一个三角形,三个顶点分别为(0,0),(n,m),(p,0),(0<=n<32000, 0<m<32000, p在整数范围内)
求这个三角形内部格点个数(格点就是横纵坐标都为整数的点,点在三角形上不算在三角形内)
思路:
函数line(x,y),返回在线段((0,0),(x,y))上的格点的个数,显然等于gcd(x,y)+1
可以写一个函数,在直角三角形((0,0),(x,0),(x,y))内的格点的个数,思路是(矩形割点个数 - 对角线格点个数)/ 2 - 两边的格点个数
然后答案就会等于两个直角三角形的格点个数和或者格点个数差,注意细节即可。
code:
/*
ID: jasison2
LANG: C++
TASK: fence9
*/
#include <cstdio>
int n, m, p;
void input()
{
scanf("%d %d %d", &n, &m, &p);
}
int line(int x, int y)
{
int mod;
while (mod = x % y)
{
x = y;
y = mod;
}
return y+1;
}
long long calc(int x, int y)
{
return ((x+1)*(y+1) - line(x,y)) / 2 - (x+y-1);
}
void output()
{
long long ans = calc(n,m);
if (p > n) ans += calc(p-n, m) + m-1;
else if (p < n) ans -= calc(n-p,m) + (line(n-p,m)-2);
else if (p == n) ;
printf("%lld\n", ans);
}
int main()
{
freopen("fence9.in","r",stdin);
freopen("fence9.out","w",stdout);
input();
output();
}