Taxes (哥德巴赫猜想)
Taxes
Mr. Funt now lives in a country with a very specific tax laws. The total income of mr. Funt during this year is equal to n (n ≥ 2) burles and the amount of tax he has to pay is calculated as the maximum divisor of n (not equal to n, of course). For example, if n = 6 then Funt has to pay 3 burles, while for n = 25 he needs to pay 5and if n = 2 he pays only 1 burle.
As mr. Funt is a very opportunistic person he wants to cheat a bit. In particular, he wants to split the initial n in several parts n1 + n2 + ... + nk = n (here k is arbitrary, even k = 1 is allowed) and pay the taxes for each part separately. He can't make some part equal to 1 because it will reveal him. So, the condition ni ≥ 2should hold for all i from 1 to k.
Ostap Bender wonders, how many money Funt has to pay (i.e. minimal) if he chooses and optimal way to split n in parts.
Input
The first line of the input contains a single integer n (2 ≤ n ≤ 2·109) — the total year income of mr. Funt.
Output
Print one integer — minimum possible number of burles that mr. Funt has to pay as a tax.
Examples
4
2
27
3
题解: 哥德巴赫猜想
内容大概是如下两点:
1、所有大于2的偶数可以被分解成两个素数。
2、所有大于7的奇数可以被分解成三个素数。(n-3)为偶数,3是一个素数,所以是三个。
所以知道这个猜想之后就变得简单了:
1、偶数:n为2,答案是1,否则答案是2.
2、奇数:首先,n最少可以拆成三个素数,还有两种情况要考虑:n本身是一个素数的话答案就是1,n-2是一个素数答案就是2(一个奇数可以拆成一个偶数+一个奇数,偶数只有2是素数)。
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 using namespace std;
5 const int maxn=1e5+10;
6 bool check(int n)
7 {
8 for(int i=2;i*i<=n;i++)
9 {
10 if(n%i==0)
11 return false;
12 }
13 return true;
14 }
15 int main()
16 {
17 int n;
18 cin>>n;
19 int ans;
20 if(n&1)
21 {
22 if(check(n))
23 ans=1;
24 else if(check(n-2))
25 ans=2;
26 else
27 ans=3;
28 }
29 else
30 {
31 if(n==2)
32 ans=1;
33 else
34 ans=2;
35 }
36 printf("%d\n",ans);
37 return 0;
38 }