Codeforces 616 E Sum of Remainders

Discription

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.

Example

Input
3 4
Output
4
Input
4 4
Output
1
Input
1 1

Output
0



数论分块大水题,我是把n%i 转化成 n-i*[n/i]做的233

#include<bits/stdc++.h>
#define ll long long
const int ha=1000000007;
using namespace std;
ll N,M,ans;

inline int add(int x,int y){
    x+=y;
    return x>=ha?x-ha:x;
}

inline int ci(ll x){
    x%=ha;
    return x*(ll)(x+1)/2%ha;
}

inline void solve(){
    ans=M%ha*(N%ha)%ha,M=min(M,N);
    for(ll i=1,j,now;i<=M;i=j+1){
        now=N/i,j=min(N/now,M);
        ans=add(ans,ha-add(ci(j),ha-ci(i-1))*now%ha);
    }
    printf("%I64d
",ans);
}

int main(){
    scanf("%I64d%I64d",&N,&M);
    solve();
    return 0;
}

  

 
原文地址:https://www.cnblogs.com/JYYHH/p/8633987.html