Codeforces Round #440 (Div. 2) C. Maximum splitting

C. Maximum splitting

Problem Statement

    You are given several queries. In the i-th query you are given a single positive integer ni . You are to represent ni as a sum of maximum possible number of composite summands and print this maximum number, or print -1, if there are no such splittings.
    An integer greater than 1 is composite, if it is not prime, i.e. if it has positive divisors not equal to 1 and the integer itself.

Input

    The first line contains single integer q (1 ≤ q ≤  105 ) — the number of queries.
    q lines follow. The (i + 1)-th line contains single integer ni (1 ≤ ni ≤  109 ) — the i-th query.

Output

    For each query print the maximum possible number of summands in a valid splitting to composite summands, or -1, if there are no such splittings.

Examples

Example 1
    Input
        1
        12
    Output
        3
Example 2
    Input
        2
        6
        8
    Output
        1
        2
Example 3
    Input
        3
        1
        2
        3
    Output
        -1
        -1
        -1

Note

    12 = 4 + 4 + 4 = 4 + 8 = 6 + 6 = 12, but the first splitting has the maximum possible number of summands.
    8 = 4 + 4, 6 can’t be split into several composite summands.
    1, 2, 3 are less than any composite number, so they do not have valid splittings.

题意

    给出一个数,将这个数分成若干个合数的和,求最多能分成多少个合数

思路

    对于一个数,我们可以将它按照mod 4的意义下分类讨论:
    0 : 直接分成若干个4,ans = n / 4;
    1 : 提出一个9(模4余1意义下最小合数),剩下的分成若干个4,ans = (n - 9) / 4 + 1
    2 : 提出一个6(模4余2意义下最小合数),剩下的分成若干个4,ans = (n - 6) / 4 + 1
    3 : 提出一个15(模4余3意义下最小合数),剩下的分成若干个4,ans = (n - 15) / 4 + 2

Code

#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline void readInt(int &x) {
    x=0;int f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    x*=f;
}
inline void readLong(ll &x) {
    x=0;int f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    x*=f;
}
/*================Header Template==============*/
int n,k;
int main() {
    cin>>n;
    while(n--) {
        cin>>k;
        if(k==1||k==2||k==3||k==5||k==7||k==11) {
            puts("-1");
            continue;
        }
        if(k%4==0) {
            printf("%d\n",k/4);
            continue;
        }
        if(k%4==1) {
            printf("%d\n",(k-9)/4+1);
            continue;
        }
        if(k%4==2) {
            printf("%d\n",k/4);
            continue;
        }
        if(k%4==3) {
            printf("%d\n",(k-9)/4+1);
            continue;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值