求助
查看原帖
求助
965238
Fwio_楼主2023/4/8 17:07

#前缀和预处理开不了1e8,一开就全MLE,望大佬解救

#include<iostream>
#include<cstring>
#include<bitset>
using namespace std;
const int N = 1e8;
bitset<N> isprime; 
int cnt , q , l , r;
int f[N];
int prime[N >> 1];
inline int F(int x){
	int sum = 0;
	while(x) sum += x % 10 , x /= 10;
	return sum;
}
inline int read(){
	int x = 0 , f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9'){
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * f;
}
inline void print(int x){
	if(x < 0) putchar('-') , x = -x;
	if(x > 9) print(x / 10);
	putchar(x % 10 + '0');
}
int main(){
	isprime.set();
	isprime[1] = 0;
	for(register int i = 2;i <= 1e8;i++){
		if(isprime[i]) prime[++cnt] = i;
		for(register int j = 1;i * prime[j] <= 1e8 && j <= cnt;j++){
			isprime[i * prime[j]] = 0;
			if(i % prime[j] == 0) break;
		}
	}	
	f[1] = 0;
	for(register int i = 2;i <= 1e7;i++){
		if(isprime[i] && isprime[F(i)]) f[i] = f[i - 1] + 1;
		else f[i] = f[i - 1];
	}
	q = read();
	while(q--){
		l = read() , r = read();
		print(f[r] - f[l - 1]);
		putchar('\n');
	}
	return 0;
}
2023/4/8 17:07
加载中...