题意:坐标系中三点(0, 0), (n, m), (p, 0)围成一个三角形(0<=n<32000, 0<m<32000, p>0),求三角形内部(不在边上)整数坐标的点有多少个?
解题思路:
- 将整个三角形分为两个部分(设(0, 0)为O,(n, m)为A,(p, 0)为P,(n, 0)为N),这两部为ONA和PNA。
- 分别统计这两个三角形中整数坐标点的个数sum1和sum2。对于每一个横坐标i,求对应的纵坐标j,那么就能得到这个横坐标下的整数坐标点有多少个。
- sum1的统计不包含横坐标n,sum2的统计也不包含横坐标n。如果为钝角三角形,sum2的统计还要加上AP上的整数点。
- 最后根据情况输出最后的结果。如果为p > n且 n != 0,则整数点个数为sum1 + sum2 + (m - 1),如果n == 0,则个数为sum1 + sum2。如果p < n,则为sum1 - sum2。如果p == n,则为sum1
代码:
/*
ID: zc.rene1
LANG: C
PROG: fence9
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
FILE *fin, *fout;
int n, m, p;
int i, sum1 = 0, sum2 = 0;
fin = fopen("fence9.in", "r");
fout = fopen("fence9.out", "w");
fscanf(fin, "%d %d %d", &n, &m, &p);
for (i=1; i<n; i++)
{
sum1 += (m * i / n);
if (((m * i ) % n) == 0)
{
sum1--;
}
}
if (p > n)
{
for (i=n+1; i<p; i++)
{
sum2 += (p - i) * m / (p - n);
if ((((p - i) * m) % (p - n)) == 0)
{
sum2--;
}
}
}
else
{
for (i=p+1; i<n; i++)
{
sum2 += (p - i) * m / (p - n);
}
}
if (p > n)
{
if (n != 0)
{
fprintf(fout, "%d\n", sum1 + sum2 + (m - 1));
}
else
{
fprintf(fout, "%d\n", sum1 + sum2);
}
}
else if (p < n)
{
fprintf(fout, "%d\n", sum1 - sum2);
}
else
{
fprintf(fout, "%d\n", sum1);
}
return 0;
}