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\n",ans); } int main(){ scanf("%I64d%I64d",&N,&M); solve(); return 0; }
我爱学习,学习使我快乐