整数拆分
整数拆分
我们规定 $f(x)$($x \geq 2$)表示整数 $x$ 的除本身之外的最大因数。
例如,$f(6)=3$,$f(25)=5$,$f(2)=1$。
现在,给定一个整数 $n$,请你将其拆分为 $k$ 份 $n_1,n_2, \dots ,n_k$(也可以不拆分,即 $k=1$),要求:
- $n_1+n_2+ \dots +n_k=n$
- 对于 $1 \leq i \leq k$,$n_i \geq 2$ 始终成立。
- $f(n_1)+f(n_2)+ \dots +f(n_k)$ 的值应尽可能小。
输出 $f(n_1)+f(n_2)+ \dots +f(n_k)$ 的最小可能值。
输入格式
一个整数 $n$。
输出格式
一个整数,表示 $f(n_1)+f(n_2)+ \dots +f(n_k)$ 的最小可能值。
数据范围
前 $4$ 个测试点满足 $2 \leq n \leq 30$。
所有测试点满足 $2 \leq n \leq 2 \times {10}^{9}$。
输入样例1:
4
输出样例1:
2
输入样例2:
27
输出样例2:
3
解题思路
如果$n$是质素那么有$f(n) = 1$。
如果$n$是偶数,根据哥德巴赫猜想:“每一个不小于$6$的偶数都是两个奇素数之和”。
- 如果$n=2$,因为$2$是质数所以有$f(2) = 1$。
- 如果$n = 4$,如果不拆分的话$f(4) = 2$,如果拆分的话则拆成两个$2$,$f(2)+f(2) = 2$。因此有$f(4) = 2$。
- 如果$n$是大于等于$6$的偶数,因为$n$是偶数因此必然不是质数,因此必然有$f(n) \geq 2$。又根据哥德巴赫猜想,每一个不小于$6$的偶数都是两个奇素数之和,而每个质数的$f$均是$1$,因此可以取到$2$,即如果$n$是大于等于$6$的偶数则有$f(n) = 2$。
如果$n$既不是质数,也不是偶数,那么$n$是奇合数,因此$f(n) \geq 2$。如果要取到$2$,意味着可以拆除两个质数的和,又因为$n$是奇数,因此这两个数必然有一个是奇数,另外一个是偶数,且两个数都要是偶数,因此偶数必然取$2$。
- 如果$n-2$是质数,那么答案就是$2$。
- 如果$n-2$是合数,那么$f(n) \geq 3$。如果$n$要拆成$3$个以上的数的和,那么$f(n) \geq 3$,因为即使是$3$个质数答案也是要大于等于$3$。现在不管是拆成两个数还是三个数以上,答案都是大于等于$3$。根据哥德巴赫猜想,每一个不小于$9$的奇数都是三个奇素数之和,因此$3$是可以取到的。因此如果$n-2$是合数,那么$f(n) = 3$($3$,$5$,$7$已经在判断质数的时候被处理了)。
AC代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 bool is_prime(int x) { 5 for (int i = 2; i <= x / i; i++) { 6 if (x % i == 0) return false; 7 } 8 return true; 9 } 10 11 int main() { 12 int n; 13 cin >> n; 14 if (is_prime(n)) printf("1"); 15 else if (n % 2 == 0 || is_prime(n - 2)) printf("2"); 16 else printf("3"); 17 18 return 0; 19 }
参考资料
AcWing 4622. 整数拆分(AcWing杯 - 周赛):https://www.acwing.com/video/4446/
哥德巴赫猜想:https://hanyu.baidu.com/s?wd=%E5%93%A5%E5%BE%B7%E5%B7%B4%E8%B5%AB%E7%8C%9C%E6%83%B3&device=pc&from=home
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/16757108.html