您的位置:首页 > 其它

51NOD-1225 余数之和

2016-10-10 13:10 232 查看
1225 余数之和


基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题


 收藏


 关注

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的结果即可。

Input
输入1个数N(2 <= N <= 10^12)。


Output
输出F(n) Mod 1000000007的结果。


Input示例
6


Output示例
3


当n <= 1e6时,暴力解决,当n > 1e6时,把n/1和n/2之间的数对于n的取模成等差数列用公式求和,同样n/2, 和n/3之间的数也是如此以此类推

#include <bits/stdc++.h>
#define maxn 50005
#define MOD 1000000007
using namespace std;
typedef long long ll;

int main(){

// freopen("in.txt", "r", stdin);
ll n;

scanf("%I64d", &n);
ll d1, d2 = n, e = 1, ans = 0;
while(d2 > 1000000){
d1 = n / e, d2 = n / (e + 1);
if(n % e == 0)
d1--;
d2++;
ans += (n % d1 + n % d2)% MOD * ((d1 - d2 + 1) % MOD) % MOD* 500000004 % MOD;
ans %= MOD;
e++;
d2--;
}
for(int i = 2; i <= d2; i++)
(ans += n % i) %= MOD;
printf("%I64d\n", ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: