题意:求解 ∑mi=1nmodi 。
思路:我们化简 nmodi=n−n/i∗i 。这样原式 =n∗m−∑mi=1(n/i∗i)
首先 m<=n−−√ 时,直接暴力,对于剩下的,我们可以分块来搞,总会存在一段连续的值使得 n/i 为定值,那么我们找到这个区间就可以了。
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 1000100
#define MOD 1000000007
const int MAXN = 100010;
const int MAXM = 40010;
long long n,m;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t,C = 1;
//scanf("%d",&t);
while(scanf("%lld%lld",&n,&m) != EOF)
{
long long ans = n%MOD * (m%MOD) % MOD;
m = min(n,m);
long long k = sqrt(n);
for(long long i = 1; i <= k; i++)
{
long long l = n / (i+1) + 1,r = n / i;
if(l > m)
continue;
if(r > m)
r = m;
l %= MOD;
r %= MOD;
ans -= i * ((l+r) * (r-l+1) / 2 % MOD);
ans %= MOD;
}
k = n / (k + 1);
for(long long i = 1; i <= min(k,m); i++)
ans -= n / i * i % MOD;
printf("%lld\n",(ans%MOD+MOD)%MOD);
}
return 0;
}