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
",ans<<1);
    }
}
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/7400531.html