码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 1393 Highways

时间:2017-08-20 18:41:49      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:16px   code   main   algorithm   max   href   大小   space   https   

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

标签:16px   code   main   algorithm   max   href   大小   space   https   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!