F(n) = (n % 1) + (n % 2) + (n % 3) + … (n % n)。其中%表示Mod,也就是余数。
例如F(6) = 6 % 1 + 6 % 2 + 6 % 3 + 6 % 4 + 6 % 5 + 6 % 6 = 0 + 0 + 0 + 2 + 1 + 0 = 3。
给出n,计算F(n), 由于结果很大,输出Mod 1000000007的结果即可。
输入
输入1个数N(2 <= N <= 10^12)。
输出
输出F(n) Mod 1000000007的结果。
输入样例
6
输出样例
3
余数 = n - n/i*i
很显然n/i只会有n的因子个数那么多
而且n/i在连续的一段区间内都是一样的。
这个用一个等差序列去维护i就好了
然后就可以在sqrtn的复杂度解决这道题了。
注意爆long long
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod = 1e9 + 7; int main() { long long n, inv = 500000004; cin >> n; long long ans = (n % mod) * (n % mod) % mod; for (long long i = 1,j; i <= n; i = j + 1) { j = n/(n/i); ll x = n/i*(j + i)%mod; ll y = (j - i + 1)%mod * inv % mod; ans -= x * y; ans = (ans % mod + mod) % mod; } cout << ans << endl; return 0; }