数论分块证明与例题

证明:
数论分块
例题:
1257: [CQOI2007]余数之和
1257
本质是求 i = 1 n ( k % i ) = i = 1 n ( k i k i ) = n k i = 1 n ( i k i ) \sum_{i=1}^n(k \% i)=\sum_{i=1}^n(k-i*\lfloor{\frac{k}{i}}\rfloor)=nk-\sum_{i=1}^n(i*\lfloor{\frac{k}{i}}\rfloor)

因此可以有如下代码:

#include <iostream>
using namespace std;
#define min(a, b) (a < b? a: b)
#define max(a, b) (a > b? a: b)
typedef long long ll;

int main()
{
	ll n, k; cin >> n >> k;
	ll res = n * k;
	int j = 0;
	for (int i = 1; i <= n; i = j + 1)
	{
		if (k / i == 0) break;
		j = min(n, k / (k / i));
		res -= (ll)(i + j) * (j - i + 1) / 2 * (k / i);
	}
	cout << res << endl;
	return 0;
}
发布了109 篇原创文章 · 获赞 108 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/u013700358/article/details/97166124