3.4.3 Electric Fence 电网

3.4.3 Electric Fence 电网

时间: 1ms        内存:64M

描述:

在本题中,格点是指横纵坐标皆为整数的点。

为了圈养他的牛,农夫约翰建造了一个三角形的电网。他从原点(0,0)牵出一根通电的电线,连接格点(n,m)(0<=n<32000,0<m<32000),再连接格点(p,0)(p>0),最后回到原点。

牛可以在不碰到电网的情况下被放到电网内部的每一个格点上(十分苗条的牛)。如果一个格点碰到了电网,牛绝对不可以被放到该格点之上。那么有多少头牛可以被放到农夫约翰的电网中去呢?

输入:

输入文件只有一行,包含三个用空格隔开的整数:n,m和p。

输出:

输出文件只有一行,包含一个整数,代表能被指定的电网包含的牛的数目。

示例输入:

7 5 10

示例输出:

20

提示:

参考答案(内存最优[752]):

#include <stdio.h>
int res;
int solve(int n,int m){
	int sum=0,i,a;
	if(n==m)
		return (n-1)*(n-2)/2;
	if(m<n){
		m^=n;
		n^=m;
		m^=n;
	}
	res=0;
	for(i=1;i<n;i++){
		a=m*i/n;
		sum+=a;
		if(a*n==m*i)
			res++;
	}
	return sum-res;
}
int main(){
	int n,m,p;
	while(scanf("%d%d%d",&n,&m,&p)!=EOF){
		if(n<=p)
			printf("%d\n",solve(n,m)+solve(p-n,m)+((n==p || n==0)?0:m-1));
		else
			printf("%d\n",solve(n,m)-solve(n-p,m)-res);
	}
	return 0;
}

参考答案(时间最优[0]):

#include <stdio.h>
int res;
int solve(int n,int m){
	int sum=0,i,a;
	if(n==m)
		return (n-1)*(n-2)/2;
	if(m<n){
		m^=n;
		n^=m;
		m^=n;
	}
	res=0;
	for(i=1;i<n;i++){
		a=m*i/n;
		sum+=a;
		if(a*n==m*i)
			res++;
	}
	return sum-res;
}
int main(){
	int n,m,p;
	while(scanf("%d%d%d",&n,&m,&p)!=EOF){
		if(n<=p)
			printf("%d\n",solve(n,m)+solve(p-n,m)+((n==p || n==0)?0:m-1));
		else
			printf("%d\n",solve(n,m)-solve(n-p,m)-res);
	}
	return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注