首页 > 其他 > 详细

UVA 1393 Highways

时间:2017-08-20 17:57:47      阅读:234      评论:0      收藏:0      [点我收藏+]

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

原文:http://www.cnblogs.com/TheRoadToTheGold/p/7400531.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!