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

Posted Roni

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

  

以上是关于2017年浙工大迎新赛热身赛 J Forever97与寄信 数论/素数/Codeforces Round #382 (Div. 2) D. Taxes的主要内容,如果未能解决你的问题,请参考以下文章

2017.12.23 浙江工大 迎新赛

河工大玲珑杯校赛随笔

哈尔滨理工大学2016新生赛J题

2017ACM省赛总结与生涯回顾

2017中国大学生程序设计竞赛-总决赛-重现赛(感谢哈工大)

牛客网 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-低年级组)求最大值