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;
}
posted @ 2020-09-14 23:43  一段时光  阅读(92)  评论(0)    收藏  举报