zoukankan      html  css  js  c++  java
  • UVA 1393 Highways

    UVA 1393 Highways

    题意:给你一个n*m的点阵,让你求出矩阵中所能连出的非水平和非竖直的直线的个数。

    思路:

      方向‘/’ 和 方向 ‘’ 对称,枚举直线所在矩形的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<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m,g[301][301]; 
    int gcd(int x,int y){
        return x==0?y:gcd(y%x,x);
    }
    int main(){
        for(int i=1;i<=300;i++)    
            for(int j=1;j<=300;j++)
                g[i][j]=gcd(i,j);
        while(scanf("%d%d",&n,&m)&&n!=0&&m!=0){
            long long ans=0;
            for(int i=1;i<n;i++)
                for(int j=1;j<m;j++)
                    if(g[i][j]==1)
                        ans+=(n-i)*(m-j)-max(0,n-2*i)*max(0,m-2*j);
            cout<<ans*2<<endl;
        }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    linux python2.6升级2.7
    Kafka介绍及安装部署
    kafka搭建
    Zookeeper 集群的安装及高可用性验证已完成!
    grafana初体验
    mac 密码重置
    制作 macOS High Sierra U盘
    运维监控篇Zabbix简单的性能调优
    zabbix主动模式设置
    OpenCV入门:(六:基础画图函数)
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7607748.html
Copyright © 2011-2022 走看看