题意就是给你一个数N,然后把这个数分成任意份大小不同的数,把这个数看成一份也可以,还有就是每份都要大于1,你要怎么分才能使每份数除自己外的最大因数加起来最小。要每个数除自己外的最大因数最小那就会想到素数,因此要尽量使这个给出的数分成几份素数,这其中可以用到已被证明的哥德巴赫猜想:大于等于4的偶都可以由两个相加得到。所以除2以外的偶数都只需要输出2即可,2的情况特判一下;如果是奇数,先判断是否为素数,在判断这个数N-2是否为素数,如果都不是的话我们还可用上面的哥德巴赫猜想推导出大于等于7的奇数都可以由3个素数相加得到,输出3就行!
博主就是在比赛时卡在了没有判断N-2为素数的情况,当时脑子秀逗了。代码很短,就是脑洞不够,好题赞一个!
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
bool judge(int key){
for(int i = 2; i*i <= key; i ++){
if(key%i == 0) return false;
}
return true;
}
int main(){
int n;
scanf("%d", &n);
if(n&1 || n == 2){
if(judge(n)) printf("1\n");
else if(judge(n-2)) printf("2\n");
else printf("3\n");
}
else printf("2\n");
return 0;
}