Fraction Floor Sum(数论分块)

题目链接:link

题目大意:

给你一个正整数 N N N,求解 ∑ i = 1 N [ N i ] \sum\limits_{i=1}^N[\frac{N} {i}] i=1N[iN]

解题思路:

根据结论可知 [ N i ] [\frac{N} {i}] [iN] 最多有 2 N 2\sqrt{N} 2N 个不同的值,证明如下:

  1. 1 ≤ i ≤ N 1≤i≤\sqrt{N} 1iN 时,因为 i i i N \sqrt{N} N 种,所以 [ N i ] [\frac{N} {i}] [iN]最多也有 N \sqrt{N} N 种。
  2. N ≤ i ≤ N \sqrt{N}≤i≤N N iN时,因为 [ N i ] [\frac{N} {i}] [iN]是随着i增大而减小的,所以 [ N i ] [\frac{N} {i}] [iN]的范围为: [ 1 , N ) [1,\sqrt{N}) [1,N ),所以 [ N i ] [\frac{N} {i}] [iN]最多也是 N \sqrt{N} N 种。
  3. 综上, [ N i ] [\frac{N} {i}] [iN] 最多有 2 N 2\sqrt{N} 2N 个不同的值。

因为是下取整,所以我们不难发现,存在几段连续的 [ N i ] [\frac{N} {i}] [iN]是相等的,并且通过上面可知 [ N i ] [\frac{N} {i}] [iN] 最多有 2 N 2\sqrt{N} 2N 个不同的值,故将每个值 × × × 区间长度然后累加起来即为答案,复杂度为O( N \sqrt{N} N )。
求解区间长度:假设区间左端点为 L L L(已知),右端点为 R R R,通过这个式子 N L = N R \frac{N} {L}=\frac{N} {R} LN=RN 我们可以求出来 R = N / ( N / L ) R= N/(N/L) R=N/(N/L)。我们从 L = 1 L=1 L=1开始枚举,求解完一个区间后,更新 L = R + 1 L=R+1 L=R+1

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	ll n, ans = 0;
	cin >> n;
	for (ll l = 1, r; l <= n; l = r + 1)
	{
		r = n / (n / l);
		ans += (r - l + 1) * (n / l);
	}
	cout << ans << endl;
	return 0;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值