整数拆分

整数拆分

我们规定 $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

posted @ 2022-10-06 10:11  onlyblues  阅读(67)  评论(0编辑  收藏  举报
Web Analytics