CF749A Bachgold Problem 题解
Content
给定一个数 \(n\),求它最多能够拆分成多少个质数,并输出拆分成的每一个质数。
数据范围:\(2\leqslant n\leqslant 10^5\)。
Solution
我们考虑尽可能地用小的数拆分。
由样例 \(2\) 可知,拆分成的质数可以重复,那么就考虑用最小的两个—— \(2\) 和 \(3\),来拆分。
我们通过奇偶性来分类讨论:
- 当 \(n\) 为奇数,此时我们可以考虑 \(n-3\) 用 \(\dfrac{n-3}{2}\) 个 \(2\) 来拆分,最后用 \(3\)。至于为什么不是先拆分成 \(\dfrac{n-1}{2}\) 个 \(2\)……因为最后剩个 \(1\) 没法拆分啊……
- 当 \(n\) 为偶数,此时直接用 \(\dfrac{n}{2}\) 个 \(2\) 来拆分就好。
Code
#include <cstdio>
using namespace std;
int n;
int main() {
scanf("%d", &n);
printf("%d\n", n / 2);
if(n % 2) {
for(int i = 1; i <= (n - 3) / 2; ++i)
printf("2 ");
printf("3");
} else
for(int i = 1; i <= n / 2; ++i)
printf("2 ");
}