题意:给出n,m,计算sigma(n%i)(1<=I<=m)。
思路:将原式化简成 .
注意到n/I和i最多只能有一项大于sqrt(n),所以分别枚举这两项然后相加。
#include <bits/stdc++.h>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
#define pb push_back
#define mp make_pair
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int MOD = 1e9+7;
LL n, m;
LL pow_mod(int a, int b) {
if (!b) return 1;
LL ans = pow_mod(a, b/2);
ans = (ans*ans) % MOD;
if (b&1) ans = ans * a % MOD;
return ans;
}
int main()
{
//freopen("input.txt", "r", stdin);
cin >> n >> m;
LL ans = n%MOD * (m%MOD) % MOD;
m = min(m, n);
LL q = (LL)sqrt(n);
LL inv = pow_mod(2, MOD-2);
for (int i = 1; i <= q; i++) {
LL l = min(m, n/(i+1)), r = min(m, n/i);
ans = (ans - (l+1+r)%MOD*((r-l)%MOD)%MOD*inv%MOD*i%MOD) % MOD;
}
q = min(q, m);
for (int i = 1; i <= q; i++)
ans = (ans - n/i*i) % MOD;
if (q == n/q)
ans = (ans + n/q*q) % MOD;
ans = (ans + MOD) % MOD;
cout << ans;
return 0;
}