zoukankan      html  css  js  c++  java
  • Taxes (哥德巴赫猜想)

     Taxes

     CodeForces - 735D 

    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

    Input
    4
    Output
    2
    Input
    27
    Output
    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
    ",ans);
    37 return 0;
    38 }
  • 相关阅读:
    C++ const用于iterator
    C++实现类似python中的字符串split函数
    简单地解释overwrite
    ubuntu16.04 新安装的系统启动ssh服务
    强化学习7日打卡营-世界冠军带你从零实践--基于表格型方法的 RL
    spark-遇到问题小结
    Spark 读写hive 表
    spark-shell 显示乱码
    机器学习-GBDT和XGboost
    链表
  • 原文地址:https://www.cnblogs.com/1013star/p/9607659.html
Copyright © 2011-2022 走看看