51NOD-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;
} 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值