Min25 求助
查看原帖
Min25 求助
714254
tder楼主2024/6/17 22:11
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e11, M = sqrt(N) + 5;
int b[M];
vector<int> v;
void init() {
	for(int i = 2; i <= M - 5; i++) {
		if(!b[i]) v.push_back(i);
		for(int j = 0; j < v.size(); j++) {
			int p = v[j];
			if(p * i > M - 5) break;
			b[p * i] = 1;
			if(!(i % p)) break;
		}
	}
}
int n, d[M * 2], f[M], g[M], cnt, s, h[M * 2];
int& work(int x) {
	if(x <= s) return f[x];
	else return g[n / x];
}
int getpi(int n) {
	s = sqrt(n); cnt = 0;
	for(int l = 1, r; l <= n; l = r + 1) {
		r = n / (n / l);
		d[work(n / l) = ++cnt] = n / l, h[cnt] = n / l - 1;
	}
	for(int i = 0; i < v.size(); i++) for(int j = 1; d[j] >= v[i] * v[i]; j++) h[j] -= h[work(d[j] / v[i])] - i;
	return h[1];
}
int l, r;
signed main() {
	init();
	cin>>l>>r; cout<<getpi(r) - getpi(l - 1)<<endl;
}
2024/6/17 22:11
加载中...