• 矩形并(2020强智杯)


    题目链接:https://ac.nowcoder.com/acm/contest/9699/H

    题目描述:

    
      Bobo 有一个矩形A。举行的左下角坐标是 (x1, y1),右上角坐标是 (x2, y2)。设 R(i, j) 是左下角坐标是 (0, 0),右上角坐标是 (i, j) 的矩形,Area(i, j) 是矩形 A 和矩形 R(i, j) 的并的面积。
    
    给出 a 和 b,求:i=1aj=1bArea(i,j)除以 (10+ 7) 的余数。
     

    输入描述:

    输入文件包含多组数据,请处理到文件结束。
    每组数据的第一行包含两个整数 a 和 b,第二行包含四个整数 x1, x2, y1, y2.
     · 1 ≤ a, b, x1, x2, y1, y2 ≤ 109
     · x1 < x2 , y1 < y2
     · 数据组数不超过 104

    输出描述:

    对于每组数据,输出一个整数,表示所求的值。

    示例:

    输入:
    1 1
    2 3 2 3
    10 10
    1 5 1 5
    1000000000 1000000000
    1 1000000000 1 1000000000
    
    输出:
    2
    3725
    2793

    题目分析:

    1,先不论题目,本题有一个要求结果 “(10+ 7) 的余数”。

    因为如果mod简单的数理论上会增大算法错误但是由于巧合恰好模出相等的数,而AC的概率

    而1e9+7这个数是素数,相加不爆int,相乘不爆ll。

    所以由于在运算过程中说有数都可能爆ll所以在相加相乘的时候要随时余mod!

    2,在算数运算符的左侧如果运算数num都是int类型而运算符右侧都是long long型时,运算符右侧运算数 num 需要 * 1LL

    *1LL是为了在计算时,把int类型的变量转化为long long,然后再赋值给long long类型的变量

    例如,long long ans = 0;anslong long类型的,

    ans += num * 1LL * (num - 1) / 2;

    不至于后面计算溢出,* 1LL之后类型就转换为long long, num变量是定义为int类型的。

    3.在写题时,看到阶乘符号,首先想到的是使用while把结果累加。

    而实际上可以直接使用数列求和公式直接把结果算出来,从而降低时间复杂度。

    代码:

    c:

    #include<cstdio>
    typedef long long ll;
    const ll mod = 1e9 + 7;
    
    ll all(ll xx, ll yy)
    {
        return xx * (xx + 1) / 2 % mod * (yy * (yy + 1) / 2 % mod) % mod;
    }
    int main()
    {
        ll a, b;
        ll x1, y1, x2, y2;
        while (~scanf("%lld %lld %lld %lld %lld %lld", &a, &b, &x1, &x2, &y1, &y2))
        {
            ll ans = 0;
            ans += all(a, b) % mod;
            ans = (ans + a * b % mod * (x2 - x1) % mod * (y2 - y1) % mod) % mod;
    
            if (x1 < a && y1 < b)
            {
                ll x = a - x1, y = b - y1;
                ans = (ans + mod - all(x, y)) % mod;
                if (x2 < a)
                {
                    ll xx = a - x2;
                    ans = (ans + all(xx, y)) % mod;
                }
                if (y2 < b)
                {
                    ll yy = b - y2;
                    ans = (ans + all(x, yy)) % mod;
                    if (x2 < a)
                    {
                        ll xx = a - x2;
                        ans = (ans + mod - all(xx, yy)) % mod;
                    }
                }
            }
            printf("%lld
    ", ans);
        }
        return 0;
    }

    参考:

    https://blog.csdn.net/idrey/article/details/53869954

    https://www.zhihu.com/question/26127900

  • 相关阅读:
    Zabbix基本配置及监控主机
    利用XAG在RAC环境下实现GoldenGate自动Failover
    Oracle Database 12c Data Redaction介绍
    使用Oracle官方巡检工具ORAchk巡检数据库
    浅谈C# 多态
    Qt 操作Excel
    一个适用于任何继承于QObject的类的创建工厂
    QT5 控件增加背景图片(可缩放可旋转)的几种方法
    值得推荐和学习的C/C++框架和库
    gcc/g++编译
  • 原文地址:https://www.cnblogs.com/zjw1324399/p/14298098.html
Copyright © 2020-2023  润新知