• 2017年浙工大迎新赛热身赛 J Forever97与寄信 【数论/素数/Codeforces Round #382 (Div. 2) D. Taxes】


    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 131072K,其他语言262144K
    64bit IO Format: %lld

    题目描述

    Forever97与未央是一对笔友,他们经常互相写信。有一天Forever97去邮局寄信,发现邮局的收费方式变成了按字收费,收取的费用为总字数除了其自身以外的最大因子。虽然Forever97是一个有情调的人,但他不想因新收费方式而破财,所以他打算把信分成几份寄出去来减少邮费。已知Forever97写的信共有n个字,可以拆成无数封信,也可以不拆,每封信最少为2个字。求Forever97最少需要付多少邮费?

    输入描述:

    第一行一个正整数T(T<=200),表示共有T组数据。

    第2至第T+1行每行一个正整数n(2<=n<=108)。

    输出描述:

    对每组数据输出一行,即Forever97最少需要付的邮费。
    示例1

    输入

    3
    5
    6
    9

    输出

    1
    2
    2

    说明

    对于第二组数据,一封6字信可以拆分成两封3字信,各付1邮资。
    对于第三组数据,一封9字信可以拆分成一封2字信和一封7字信,各付1邮资。

    【分析】:

    1、所有大于2的偶数可以被分解成两个素数。

    2、所有大于7的奇数可以被分解成三个素数。(n-3)为偶数,3是一个素数,所以是三个。

    所以知道这个猜想之后就变得简单了:

    1、偶数:n为2,答案是1,否则答案是2.

    2、奇数:首先,n最少可以拆成三个素数,还有两种情况要考虑:n本身是一个素数的话答案就是1,n-2是一个素数答案就是2(一个奇数可以拆成一个偶数+一个奇数,偶数只有2是素数)。

    【代码】:

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    bool ispa(int x){
        for(int i= 2;1LL*i*i <= x*1LL;i ++){
            if(x%i == 0) return false;
        }
    
        return true;
    }
    int main(){
        int t;
        cin>>t;
        while(t--){
            ll n;
        cin >>n;
        if(n%2== 0&&n != 2){
            cout << 2 << endl;
    
        }
        else {
            if(ispa(n)){ cout << 1 << endl;}
            else {
                    if(!ispa(n-2)) cout << 3 << endl;
                    else cout << 2 << endl;
            }
        }
        }
        return 0;
    }
    

      

  • 相关阅读:
    内建函数
    urllib学习
    Jupyter Notebook介绍、安装及使用教程
    grep详解、sed详解、awk详解
    正则表达式
    RedisClient.SetRandomMember
    redis 队列
    hmGet
    redis trim
    大O符号
  • 原文地址:https://www.cnblogs.com/Roni-i/p/8007600.html
Copyright © 2020-2023  润新知