codeforces 870C

本文解析了一道关于将整数拆分为合数之和的问题,并提供了一个简洁的AC代码实现。通过分析不同情况(如n对4取模的结果),提出了解决方案,包括特殊情况的处理方法。
C. Maximum splitting
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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
input
1
12
output
3
input
2
6
8
output
1
2
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.

 

说出来你们可能不信。。这题到最后我也没读懂啥意思(composite是合数的意思。。

满脑子想的是筛法,没想到就是考个思维。。。

题意:给一个数,问这个数最多能由多少个合数组成,不能组成就输出-1.

解题思路:因为最小的合数是4,所以如果n正好是4的倍数就是最多的情况。

那么就可以想到考虑n%4的情况。

1.n%4==0  这个时候直接输出n/4即可。

2.n%4==2  这个时候还是直接输出n/4,因为n%4==2相当于(n-6)%4==0,而6也是合数。

3.n%4==1 || n%4==3  那么n自然是个奇数,这个时候我们找个最小的奇合数处理下就行(n-=9;

             此时n就是个偶数了,如果n!=0 && n<4 ,那么这个数就没法全由合数构成。

             反之,则能构成,ans=1+n/4;

 

ac代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 int main() {
 5     ios::sync_with_stdio(false);
 6     cin.tie(0);cout.tie(0);
 7     int q,n;
 8     cin>>q;
 9     while(q--) {
10         cin>>n;
11         int ans=0;
12         if(n%4==0||n%4==2) {
13             ans=n/4;
14         }
15         else if(n%4==1 ||n%4==3) {
16             n-=9;
17             ans=n/4+1;
18         }
19         if(n<4 && n!=0) ans=-1;
20         cout<<ans<<endl;
21     }
22     return 0;
23 }
View Code

 

转载于:https://www.cnblogs.com/zmin/p/7676193.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值