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的主要内容,如果未能解决你的问题,请参考以下文章

UVa 1393 Highways (动态规划)

UVA 1393 Highways(数学思想)

POJ1751Highways

上古卷轴5 顶级代码高于player.additem player.AddItem 1393d 1等详细解答

无向图生成树计数 基尔霍夫矩阵 SPOJ Highways

Highways——最小生成树模板题(求距离)