rt,乱搞了一个不用筛法的做法。已经过了,但是过极端数据还是有点难。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int p[50000005], num[10000005];
bool isprime(int n) {
if (p[n] != 0) {
return p[n] == 2;
}
if (n <= 1) {
p[n] = 1;
return false;
}
if (n == 2 || n == 3) {
p[n] = 2;
return true;
}
if (n % 2 == 0) {
p[n] = 1;
return false;
}
for (int j = 3; j * j <= n; j += 2) {
if (n % j == 0) {
p[n] = 1;
return false;
}
}
p[n] = 2;
return true;
}
int N, M, maxn = 0;
void dfs(int dep) {
int base = 1 << dep;
for (int i = 3;; i += 2) {
if (isprime(i)) {
if (base * i >= N && base * i <= M) {
cout << dep + 1;
return;
} else if (base * i > M) {
dfs(dep - 1);
return;
}
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
N=(1<<22)+1,M=(1<<21)*3-1;
int thresold = M - N + 1;
cin >> N >> M;
if (M - N + 1 <= thresold) {
for (int i = 2; i <= M; ++i) {
if (isprime(i)) {
num[i] = 1;
} else {
if (i % 2 == 0) {
num[i] = num[2] + num[i / 2];
} else {
for (int j = 3; j * j <= i; j += 2) {
if (i % j == 0) {
num[i] = num[j] + num[i / j];
break;
}
}
}
}
}
for (int i = N; i <= M; ++i) {
if (num[i] > maxn) {
maxn = num[i];
}
}
cout << maxn;
return 0;
}
int k = static_cast<int>(log2(M));
if ((1 << k) >= N) {
cout << k;
return 0;
} else {
dfs(k - 1);
}
}
回复请 @ 我。看情况玄关。感激不尽