Maximum splitting
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
1
12
3
2
6
8
1
2
3
1
2
3
-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.
题意:给你一个数n,问你他最多能划分为几种几个合数的和
题解:最小的偶数合数是4,最小的奇数合数是9
四种情况:
(1)n%4 == 0:
全分成4就好了,所以ans = n/4
(2)n%4 == 1:
剩下的1要和两个4组合成一个9。
所以如果n/4 >= 2,ans = n/4 - 1
否则ans = -1
(3)n%4 == 2:
剩下的2要和一个4组合成一个6。
所以如果n/4 >= 1,ans = n/4
否则ans = -1
(4)n%4 == 3:
剩下的3 = 1 + 2。所以需要三个4,组成一个6和一个9。
所以如果n/4 >= 3,ans = n/4 - 1
也可以找规律:
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6 int main()
7 {
8 int q,n;
9 cin>>q;
10 while(q--)
11 {
12 scanf("%d",&n);
13 if(n==1||n==2||n==3||n==5||n==7||n==11)
14 printf("-1
");
15 else
16 {
17 int ans=n/4;
18 if(n%2==0)
19 printf("%d
",ans);
20 if(n%2==1)
21 printf("%d
",ans-1);
22 }
23 }
24 }