• BZOJ 3505: [Cqoi2014]数三角形


    Time Limit: 10 Sec Memory Limit: 128 MB
    Submit: 2067 Solved: 1273
    [Submit][Status][Discuss]
    Description

    给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。

    注意三角形的三点不能共线。
    Input

    输入一行,包含两个空格分隔的正整数m和n。
    Output

    输出一个正整数,为所求三角形数量。
    Sample Input

    2 2

    Sample Output
    76

    数据范围

    1<=m,n<=1000

    解题思路

    可以很快发现,其实三角形个数等于全集中所有三个点的组合-斜着的共线的三个点的组合-平着的三个点的组合,平着的可以直接算,然后发现n,m并不是很大,直接暴力枚举每条共线的三个点的两个端点,然后利用斜率,中间的点有gcd(i,j)-1种选择,再根据对称*2即可。

    代码

    #include<bits/stdc++.h>
    #define ULL unsigned long long
    
    using namespace std;
    
    inline ULL C(ULL x){return (x-1)*x*(x-2)/6;}
    
    inline int gcd(int x,int y){return y==0?x:gcd(y,x%y);}
    
    int n,m;
    ULL ans;
    
    int main(){
        scanf("%d%d",&n,&m);n++;m++;
        ans=C((ULL)n*m)-C(n)*m-C(m)*n;
        for(register int i=1;i<n;i++)
            for(register int j=1;j<m;j++)
                ans-=(n-i)*(m-j)*(gcd(i,j)-1)*2;
        printf("%llu",ans);
        return 0;
    }
  • 相关阅读:
    C++ IO: File Read Write
    C++ 作用域与存储类型及预编译指令及文件结构
    Power Threading Library
    C++ 类和对象,继承,派生
    面试题:李白喝酒的问题
    计算机科学与技术 转
    [Buzz Today]2012.02.24
    [Buzz.Today]2013.03.28
    [Buzz.Today]2013.03.14
    [Tips] 网间流传的Document.ready实现
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9676987.html
Copyright © 2020-2023  润新知