• 紫书 例题 10-28 UVa 1393(简化问题)


    这道题是对称的

    所以只算“”, 最后答案再乘以2

    然后每一条直线看作一个包围盒

    枚举包围盒的长宽

    有两种情况会重复

    (1)包围盒里面有包围盒。

    这个时候就是在一条直线上

    那么我们就gcd(x,y)>1的时候舍去

    因为在一条直线上只取gcd(x,y)=1这个点

    以后注意一条直线上去重问题都可以用gcd(x,y)= 1

    (2)还有一种情况就是对角线是在一条直线上的

    这个时候就要单独减去。

    这个时候数量为max(0, m-2a)*max(0,n-2b)

    总的数量为(m-a)*(n-b)

    所以答案为(m-a)*(n-b)-max(0, m-2a)*max(0,n-2b)

    另外因为多组数据gcd的值会用到很多次,所以提前存起来

    #include<cstdio>
    #include<algorithm>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    using namespace std;
    
    const int MAXN = 312;
    int g[MAXN][MAXN];
    
    int gcd(int a, int b) { return !b ? a : gcd(b, a % b); }
    
    int main()
    {
    	REP(i, 1, MAXN)
    		REP(j, 1, MAXN)
    			g[i][j] = gcd(i, j);
    	
    	int n, m;
    	while(~scanf("%d%d", &n, &m) && n)
    	{
    		int ans = 0;
    		REP(a, 1, m + 1)
    			REP(b, 1, n + 1)	
    				if(g[a][b] == 1)
    				{
    					int c = max(0, m - 2*a) * max(0, n - 2*b);
    					ans += (m - a) * (n - b) - c;
    				}
    		printf("%d
    ", ans * 2);
    	}
     
    	return 0;
    }
  • 相关阅读:
    第九章 引用
    第八章 指针
    第六章 面向对象
    第五章 if语句与运算符
    第四章 C++数据类型
    第三章 初步了解函数
    第二章 做一个简短的C++程序
    第一章 初始C++
    vs2012 快捷键+方法
    vue如何修改生效日期范围,以及转化成yyyy-mm-dd的格式
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819491.html
Copyright © 2020-2023  润新知