1. 程式人生 > >bzoj 1968 整除分塊

bzoj 1968 整除分塊

題目很裸,求∑i=1~n⌊n/i⌋

這個東西可以直接暴力O(n),但對於這個複雜度來說顯然不優秀

直接列舉的話會發現很多項的值都是相同的,而且呈塊狀分佈,那麼就可以用道整除分塊來解決

好了現在我們就可以在sqrt(n)的時間內求出這個值了

然鵝整除分塊經常套這莫反,有時需要求mu或者phi的字首和,就需要用到杜教篩,然後我不會就溜了

結論:一個值相同的塊的最後一個元素是n/(n/i)

貼程式碼走人

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>

using namespace std;

int n;

long long ans = 0; 

int main() {
	scanf("%d", &n);
	for (int lf = 1, rg; lf <= n; lf = rg + 1) {
		rg = n / (n / lf);
		ans += 1LL * (rg - lf + 1) * (n / lf);
	}
	cout << ans << endl;
	return 0;
}