Solution
其实看不懂大家为什么怕$n \le 10^5$的数据普通判断法会爆。
其实$L = \sum \limits_{p_i \le L'} p_i,L' = L-p_i$,明显$p_{max}$按理说会小于$10^4$。而$10^4 \times \sqrt{10^4} = 10^6 < 10^8$,明显是可行的。(而且我用了$\Theta(\dfrac{\sqrt{n}}{3})$的算法)
那么这题就成了:求在$i$等于几时,$L - \sum \limits_{i = 1} p_i$在自然数范围内取得最小值。
暴力即可
Code
#include
using namespace std;
namespace IO { //快读快输板子
#pragma GCC target("avx")
#pragma GCC optimize("Og")
#pragma GCC optimize("Ofast")
template
inline void read(T& x) {
x = 0;
char ch = getchar();
while(ch < '0' || ch > '9') {
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
}
template
inline void write(const T& x) {
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
};
using namespace IO;
int L,cnt;
bool isprime(int x) { //判断素数
if(x == 2 || x == 3) return 1;
if(x < 2) return 0;
if(x % 6 != 1 && x % 6 != 5) return 0;
for(int i = 5;i*i <= x;i += 6) {
if(x % i == 0 || x % (i + 2) == 0) return 0;
}
return 1;
}
int main() {
read(L);
for(int i = 2;i <= L;i++) {
if(L - i < 0) {
break;
}
if(isprime(i) && L - i >= 0) {
L -= i;
write(i);puts("");
++cnt;
}
}
write(cnt);puts("");
return 0;
}