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;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。