diyiti 整除 分块

版权声明:_ https://blog.csdn.net/lunch__/article/details/82831067

题意

  • 求二元组(a, b)(a,b<=n) 满足(a % b) = b / a的个数,n<=1e12

考虑分开算贡献

a &lt; b a &lt; b 的时候

a m o d &ThinSpace;&ThinSpace; b = a a\mod b = a

那么就是求 b / a = a b / a = a 的个数

这个东西枚举 a a 直接算就可以了

a &gt; b a &gt; b 的时候

b / a = 0 b / a = 0

那么就是求 a a 的约数个数

我们反过来枚举b的倍数 n / b 1 n / b - 1

直接整除分块就可以了

复杂度 O ( n ) O(\sqrt{n})

Codes

#include<bits/stdc++.h>

#define int long long

using namespace std;

signed main() {
	//freopen("diyiti.in", "r", stdin);
	//freopen("diyiti.out", "w", stdout);
	int r, now = 1, ans = 0, n; cin >> n;
	for(int l = 1; l <= n; l = r + 1) {
		r = n / (n / l);
		ans += (r - l + 1) * (n / l - 1);
	}
	for(int i = 2; i * i <= n; ++ i) 
		ans += min(n + 1, i * (i + 1)) - i * i;
	cout << ans << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lunch__/article/details/82831067