关于纯暴力不会TLE P1835(但是会MLE)
  • 板块灌水区
  • 楼主BD_AZZR_CN
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/6 17:06
  • 上次更新2024/8/6 18:03:59
查看原帖
关于纯暴力不会TLE P1835(但是会MLE)
767779
BD_AZZR_CN楼主2024/8/6 17:06
#include <iostream>
#include <vector>
#include <bitset>
#include <math.h>
#include <algorithm>
#include <unordered_set>
using namespace std;
unsigned int L, R, ans = 0;
#define ull unsigned int
#define r(...) return __VA_ARGS__
std::vector<unsigned int> pri;
unordered_set<int> not_prime;
void fillPrism(const unsigned int &N) {
	not_prime.insert(4);
	not_prime.insert(6);
	not_prime.insert(8);
	not_prime.insert(9);
	pri.push_back(2);
	pri.push_back(3);
	for (unsigned int i = 6; i <= N; i+=6) {
		if (!not_prime.count(i-1)) {
			pri.push_back(i-1);
		}
		for (unsigned int j : pri) {
			if (((i-1) * j > N)) { break; }
			not_prime.insert((i-1) * j);
			if (((i-1) % j == 0)) { break; }
		}
		if (!not_prime.count(i + 1)) {
			pri.push_back(i + 1);
		}
		if (i + 1 > N) { break; }
		for (unsigned int j : pri) {
			if (((i + 1) * j > N)) { break; }
			not_prime.insert((i + 1) * j);
			if (((i + 1) % j == 0)) { break; }
		}
	}
}
bool isPrime(const ull &n) {
	if (n < 2 || (!(n & 1))) r(false);
	for (ull i = 3; i * i <= n; i += 2) {
		if (n % i == 0) {
			r(false);
		}
	}
	r(true);
}
int main() {
	cin >> L >> R;
	fillPrism(R);
	//L = 1;
	//R = 100;
	vector<unsigned int>::iterator LI = lower_bound(pri.begin(), pri.end(), L);
	vector<unsigned int>::iterator RI = lower_bound(pri.begin(), pri.end(), R);
	ans = distance(LI, RI);
	if (isPrime(R))ans++;
	cout << ans;
	
	system("pause");
}

C++20 O2

会MLE

请教一下(题解?看不懂思密达)

2024/8/6 17:06
加载中...