Forever97与寄信
题目传送门
题目大意
给定一个数n,可以将n分解为无数个大于2的数,然后每个数的代价为除其自身以外的最大因子,要输出最小的代价总和。
思路
根据代价的计算方式可知,如果想让最后的结果最小,需要将n分解为质数,因为每个质数的代价是1,那么,怎样才能分解为一些质数的和?这边需要了解哥德巴赫猜想。
哥德巴赫猜想:(证明过程请看百度)
1.任一大于2的偶数都可写成两个素数之和.
2.如果n是素数,那么就是1个素数组成。
3.如果n-2是素数,那么n可以由两个素数组成。
4.如果n-3是素数,那么n可以由三个素数组成。
然后这题就简单了,只要将输入的n分类讨论一下就可以AC了。
代码
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int n){
int temp=sqrt(n);
for (int i=2;i<=temp;i++){
if (n%i==0) return false;
}
return true;
}
int main(){
int t,n;
scanf("%d",&t);
while (t--){
scanf("%d",&n);
if (isPrime(n)) printf("%d\n",1);
else{
if (n&1){
if (isPrime(n-2)){
printf("%d\n",2);
}
else printf("%d\n",3);
}
else printf("%d\n",2);
}
}
return 0;
}
浙公网安备 33010602011771号