• bzoj 3505: [Cqoi2014]数三角形 组合数学


    3505: [Cqoi2014]数三角形

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 478  Solved: 293
    [Submit][Status]

    Description

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

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

    Input

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

    Output


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

    Sample Input


    2 2

    Sample Output

    76


    数据范围
    1<=m,n<=1000

    HINT

     

    Source

       这道题我居然白痴得卡在了求三点共线组数上,最开始我的想法是枚举每一个斜率的直线,计算他们的条数与交点,但是至今我还是不知道怎么弄,正确的方法应该是枚举三点共线两端点的坐标差,然后可轻而易举求出这样的端点对数,中间点的位置数,即可解此题。

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    #define MAXN 10000
    typedef long long qword;
    int gcd(int x,int y)
    {
            return (x%y==0)?y:gcd(y,x%y);
    }
    int main()
    {
            freopen("input.txt","r",stdin);
    //        freopen("output.txt","w",stdout);
            int i,j,k,x,y,z;
            int n,m;
            scanf("%d%d",&n,&m);
            n++;m++;
            int tot=0;
            qword ans0,ans1=0;
            ans0=(qword)(m*n-2)*(m*n-1)*m*n/6;
            for (i=1;i<n;i++)
            {
                    for (j=1;j<m;j++)
                    {
                            ans1+=(qword)(gcd(i,j)-1)*(n-i)*(m-j);
                    }
            }
            ans1*=2;
            ans1+=(qword)(n-2)*(n-1)*n/6*m;
            ans1+=(qword)(m-2)*(m-1)*m/6*n;
            printf("%lld
    ",ans0-ans1);
    }
     
    by mhy12345(http://www.cnblogs.com/mhy12345/) 未经允许请勿转载

    本博客已停用,新博客地址:http://mhy12345.xyz

  • 相关阅读:
    二维数组中的查找
    循环语句
    掷骰子游戏和条件语句
    类型转换与键盘输入
    运算符(2)
    运算符(1)
    面向对象(2)
    面向对象(1)
    理解几种排序方法
    优盘、移动硬盘简便制作启动盘
  • 原文地址:https://www.cnblogs.com/mhy12345/p/4049904.html
Copyright © 2020-2023  润新知