Codeforces Technocup 2018 - Elimination Round 2 C. 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

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.

题目描述:

q次询问,给出一个n,问n最多可以由多少个composite组成,composite的定义:大于1,且不为负数的非素数就是composite的

数据范围:

1 ≤ q ≤ 1e5,1 ≤ ni ≤ 1e9

Solution:

可以得出,最小的composite为4、6、9,也就相当于询问一个数能否由4、6、9来组成,如果能的话最多可以由多少个数字组成,最优解当然是优先考虑4。

先特判下1、2、3、5、7、11,然后只需要对 n%4 的余数进行讨论:

  • 如果余数为0的话,显然 ans = n/4。
  • 如果余数为2的话,那就可以用一个4加上余数的2来换一个6,那么答案依旧为 ans = n/4。
  • 如果余数为1的话,可以用2个4加上余数的1来换一个9,那么答案为 ans = n/4 - 1。
  • 如果余数为3的话,可以用三个4加上余数的3换6、9,那么答案为 ans = n/4 -1。

代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <string>
#include <algorithm>
#include <queue>
#include <vector>
#include <set>
#include <map>
#define fi first
#define se second
#define Fio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fopen freopen("in.txt", "r", stdin); freopen("out.txt", "w", stout);
#define rush() int T; scanf("%d", &T); while(T--)
#define _rush() int T; cin >> T; while(T--)
#define mst(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int MaxN = 1e5 + 5;
const int INF = 0x3f3f3f3f;
const double eps = 1e-9;

int main() 
{
	Fio;

	_rush() {
		int n; cin >> n;
		int flag = n % 4;
		int ans = n / 4;
		if(n == 1 || n == 2 || n == 3 || n == 5 || n == 7 || n == 11) cout << "-1" << endl;
		else if(flag == 0 || flag == 2) cout << ans << endl;
		else if(flag == 1 || flag == 3) cout << ans - 1 << endl;
		else cout << "-1" << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Jasmineaha/article/details/81222403