zoukankan      html  css  js  c++  java
  • HDU 2524 矩形A + B(矩阵)

    点击打开链接

    分析:应该是简单题一个吧。

    用矩阵来分析一下题目。

    设一矩阵d[i,j],d[i,j]表示为网格grid[i,j]中,所有矩形含有第[i,j]此格的总数。

    d的其中一些数据为:

     

     

    1

    2

    3

    4

    1

    1

    2

    3

    4

    2

    2

    4

    6

    8

    3

    3

    6

    9

    12

    4

    4

    8

    12

    16

    发现是很有规律的,值等于行号乘列号。并且每一行(列)都是一个等差数列。

    继续说下去的时候,先加入一个函数g(n,m),

    g(n,m) = d[n,1]+d[n,2]+d[n,3]+...+d[n,m] = (d[n,1]+d[n,m])*m/2

               = (d[n,1]+d[n,1]*m)*m/2 = (n+n*m)*m/2

               = n*(m+m^2)/2。

    简单点说,就是d矩阵里面的第n行,前m个和。

     

    好了,然后再看另一个矩阵sum[i,j],sum[i,j]就是题目要求的答案。

     

     

    1

    2

    3

    4

    1

    1

    3

    6

    10

    2

    3

    9

    18

    30

    3

    6

    18

    36

    60

    4

    10

    30

    60

    100

    再次新发现,sum[i,j]的值也是有规律的。例如:sum[3,3] = g(3,3) + g(2,3) + g(1,3)。

    所以得到

    sum[n,m] = g(1,m) + g(2,m) + g(3,m) + ... + g(n,m)

                   = 1*(m+m^2)/2 + 2*(m+m^2)/2 + 3*(m+m^2)/2 + ... + n*(m+m^2)/2

                   = ((1+n)*n/2)*((m+m^2)/2)            提取因子

                   = (n+n^2)*(m+m^2)/4

    好了,有这个公式可以直接代码了。

     

    代码:
    #include <stdio.h>
    int main()
    {
        int t,n,m;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d %d",&n,&m);
            printf("%d\n",n*(n+1)*m*(m+1)/4);
        }
        return 0;
    }


  • 相关阅读:
    问答
    正在设计taijilang的解析器,真可谓尸横遍地
    因为这些理由而坚持用grunt?其实它们都不成立。
    开始设计taijijs
    从grunt转到gulp
    google 索引
    :: operator
    用coffeescript写构造函数
    jade与angular.js
    angular.js 资料收集
  • 原文地址:https://www.cnblogs.com/yyf573462811/p/6365250.html
Copyright © 2011-2022 走看看