码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-12-09 00:43:59      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:div   font   style   bit   mod   --   question   des   简单   

时间限制: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】

标签:div   font   style   bit   mod   --   question   des   简单   

原文地址:http://www.cnblogs.com/Roni-i/p/8007600.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!