UVA 1393 Highways
Posted 日拱一卒 功不唐捐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 1393 Highways相关的知识,希望对你有一定的参考价值。
https://vjudge.net/problem/UVA-1393
题意:
a*b的点阵中能画多少条非水平非竖直的直线
方向‘/’ 和 方向 ‘\’ 对称
枚举直线所在矩形的i*j
直线可能重复的情况:
1、与矩形内部矩形的直线重复
2、与它左上角的直线连接成一条
如果gcd(i,j)>1, 那么这条直线与gcd(i,j)=1的直线是重复的
所以只枚举互质的i,j
以左上角坐标为(0,0),
这个矩形的左上角为(x,y),
它合法的条件是 x+i<a,y+j<b,一共有(a-i)*(b-j)个
这个矩形左上方的矩形的左上角为(x-i,y-j)
它合法的条件是 x-i>=0,x+i<a,y-j>=0,y+j<b,一共有(a-2*i)*(b-2*j)种放法
所以大小为i*j的矩形一共有 (a-i)*(b-j)-max(0,a-2*i)*max(0,b-2*j) 种放法
#include<cstdio> #include<algorithm> using namespace std; int gcd(int a,int b) { return !b ? a : gcd(b,a%b); } int g[301][301]; int main() { for(int i=1;i<300;i++) for(int j=1;j<300;j++) g[i][j]=gcd(i,j); int a,b; long long ans; while(scanf("%d%d",&a,&b)!=EOF) { if(!a) return 0; ans=0; for(int i=1;i<a;i++) for(int j=1;j<b;j++) if(g[i][j]==1) ans+=(a-i)*(b-j)-max(0,a-2*i)*max(0,b-2*j); printf("%lld\n",ans<<1); } }
以上是关于UVA 1393 Highways的主要内容,如果未能解决你的问题,请参考以下文章