USACO 3.4 Electric Fence

题意:

已知一个三角形,三个顶点分别为(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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值