zoukankan      html  css  js  c++  java
  • 数三角形

    【题目描述】

    给定一个n*m的网格,请计算三个点都在格点上的三角形共有多少个(三角形的三点不能共线)。

    下图为4*4的网格上的一个三角形。

     

    【输入描述】

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

    【输出描述】

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

    【样例输入】

    样例1:

    1 1

     

    样例2:

    2 2

    【样例输出】

    样例1:

    4

     

    样例2:

    76

    【数据范围及提示】

    20%的数据满足:1 ≤ m,n ≤ 10;
    100%的数据满足:1 ≤ m,n ≤ 1800。

    源代码:
    
    #include<cstdio>
    int m,n;
    unsigned long long ans;
    int GCD(int t1,int t2)
    {
        if (!t2)
          return t1;
        GCD(t2,t1%t2);
    }
    int main()
    {
        scanf("%d%d",&m,&n);
        m++; //注意起始位置。
        n++;
        ans=m*n;
        ans=ans*(ans-1)/2*(ans-2)/3; //这招妙啊。
        for (int a=0;a<=n;a++)
          for (int b=0;b<=m;b++)
            if (a||b)
            {
                unsigned long long t=(GCD(a,b)-1)*(n-a)*(m-b);
                if (!a||!b)
                  ans-=t;
                else
                  ans-=2*t;
            }
        printf("%lld",ans); //别再犯低级错误啦!
        return 0;
    }
    
    /*
        这么折腾人的题竟然只是个白银,还是太弱了。
        无数解析几何的恐惧向我袭来。
        所有情况:C(n*m,3)(在本题中0为起点);
    三点一线:     ①横竖线:n*C(m,3) + m*C(n,3);     ②对角线:线段(0,0)(n-i+1,m-j+1)有(n-i+1)*(m-j+1)种平移0方案,不在坐标轴上还要算两次,且有公式:线段(a,b)(x,y)上有gcd(a-x,b-y)-1个整点(卧槽以后得好好看课件)。
    */
  • 相关阅读:
    查询类里面对象个数
    动手动脑2
    关于随机数的产生-动手动脑1
    单词频率代码测试
    反码补码报告
    动手动脑课上总结
    java开学第一周测试代码
    【P1825】表达式整除
    工程代码の初體驗
    差分:IncDec Sequence 差分数组
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5708379.html
Copyright © 2011-2022 走看看