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.
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.
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.
1
12
3
2
6
8
1
2
3
1
2
3
-1
-1
-1
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代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }