• Codeforces 616E


    616E Sum of Remainders

    Calculate the value of the sum: n mod 1 + n mod 2 + n mod 3 + … + n mod m. As the result can be very large, you should print the value modulo 109 + 7 (the remainder when divided by 109 + 7).

    The modulo operator a mod b stands for the remainder after dividing a by b. For example 10 mod 3 = 1.
    Input

    The only line contains two integers n, m (1 ≤ n, m ≤ 1013) — the parameters of the sum.
    Output

    Print integer s — the value of the required sum modulo 109 + 7.
    Sample test(s)
    Input

    3 4

    Output

    4

    Input

    4 4

    Output

    1

    Input

    1 1

    Output

    0

    • 思路:
      1.对mod的理解与转化: n%mod = n - n/mod*mod;
      现在答案就变成了 n*m - Σ(1->m)(n/i*i),乍一看认为没什么优化,还是要求后面的从1 到m的Σ(n/i*i);这就是优化。现在就需要用到对整除的理解的~~ 对于n/x = n/i;这样的x的区间边界时什么? 经分析知:[i,n/(n/i)];却这里得到一个很有趣的结论,对于n/(n/(n/i)) = n/i;

      2.然后就是mod运算了,注意在同一个n/i下的区间内数的和(l+r)/2时,为了不爆范围,先用偶数除以二,之后在相乘;
      3.举个例子对下面程序的运行:
      比如n = 15,m = 13;
      则[1,1] ==>是第一个计算的,对于任意的x ,l <= x <= r,n/x = n/i;
      [2,2],[3,3],[4,5],[6,7],[8,13];//区间距离越来越大;这里是优化的对象;
      之后 l = r,再++l;就是对于每一个n/i相等的区间,直接利用等差数列求完,下次求解的时候,l = r+1;即区间不会覆盖;所以对于1e13范围内的数据,还是可以在436ms内求解完毕;如上面最后一次是8~13

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int mod = 1e9+7;
    int add(ll a, ll b) { return (a+b)%mod; }
    int sub(ll a, ll b) { return ((a-b)%mod + mod)%mod; }
    int mult(ll a, ll b) { return ((a%mod) * (b%mod))%mod; }
    
    int main()
    {
        ll i,n,m;
        cin>>n>>m;
        int ans = mult(n,m),sum = 0;
        m = min(n,m);
        for(i = 1;i <= m;i++){// l = i,r = n/(n/i);while:l <= x <= r ;n/x = n/i;
            ll r = n/(n/i);
            r = min(r,m);
            ll sm = i + r,nm = r - i + 1;
            if(sm&1) sm = mult(sm,nm/2);
            else sm = mult(sm/2,nm);
            sum = add(sum,mult(sm,n/i));
            i = r;
        }
        ans = sub(ans,sum);
        cout<<ans;
    }
  • 相关阅读:
    将view添加到地图覆盖物
    将eclipse的编码改成UTF-8,默认是GBK
    Android调用系统关机与重启功能
    Android中preference标签的使用
    linux中convert用法
    RookeyFrame在线新增模块
    RookeyFrame2.0发布,UI重构
    Rookey.Frame v1.0 视频教程发布了
    Rookey.Frame企业级快速开发框架开源了
    RookeyFrame模块初始化
  • 原文地址:https://www.cnblogs.com/hxer/p/5185151.html
Copyright © 2020-2023  润新知