题目
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
解题思路: ,采用数论分块的方法可以在内算出。因为数据范围比较大,所以防止爆long long,需要在乘法过程中取模.
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int inv = 5e8 + 4;
ll qmul(ll a,ll b){
ll res = 0;
a %= mod;b %= mod;
while(b){
if(b & 1) res = (res + a) % mod;
a = (a << 1) % mod;
b >>= 1;
}
return res;
}
ll cal(ll n){
ll res = qmul(n,n);
ll k;
for(ll i = 1;i <= n;i = k + 1){
k = n / (n / i);
res = ((res - qmul(qmul(qmul(i+k,k-i+1),n/i),inv)) % mod + mod) % mod;
}
return res;
}
int main(){
ll N;
cin>>N;
cout<<cal(N)<<endl;
return 0;
}