#651 (Div. 2)B. GCD Compression

題目描述

Ashish has an array a of consisting of 2n positive integers. He wants to compress a into an array b of size n−1. To do this, he first discards exactly 2 (any two) elements from a. He then performs the following operation until there are no elements left in a:
Remove any two elements from a and append their sum to b.
The compressed array b has to have a special property. The greatest common divisor (gcd) of all its elements should be greater than 1.
Recall that the gcd of an array of positive integers is the biggest integer that is a divisor of all integers in the array.
It can be proven that it is always possible to compress array a into an array b of size n−1 such that gcd(b1,b2…,bn−1)>1.
Help Ashish find a way to do so.

Input

The first line contains a single integer t (1≤t≤10) — the number of test cases. The description of the test cases follows.
The first line of each test case contains a single integer n (2≤n≤1000).
The second line of each test case contains 2n integers a1,a2,…,a2n (1≤ai≤1000) — the elements of the array a.

Output

For each test case, output n−1 lines — the operations performed to compress the array a to the array b. The initial discard of the two elements is not an operation, you don’t need to output anything about it.
The i-th line should contain two integers, the indices (1 —based) of the two elements from the array a that are used in the i-th operation. All 2n−2 indices should be distinct integers from 1 to 2n.
You don’t need to output two initially discarded elements from a.
If there are multiple answers, you can find any.

Example

input
3
3
1 2 3 4 5 6
2
5 7 9 10
5
1 3 3 4 5 90 100 101 2 3
output
3 6
4 5
3 4
1 9
2 3
4 5
6 10

Note

In the first test case, b={3+6,4+5}={9,9} and gcd(9,9)=9.
In the second test case, b={9+10}={19} and gcd(19)=19.
In the third test case, b={1+2,3+3,4+5,90+3}={3,6,9,93} and gcd(3,6,9,93)=3.

題目分析

這個題可以分成兩種情況:

  1. a[]中有奇數個奇數,此時可以刪掉一個奇數和一個偶數,這樣a[]中就是剩下了偶數個偶數和偶數個奇數,這樣組合後gcd( b[] )必定大於2。
  2. a[]中有偶數個奇數,此時就可以刪掉兩個偶數或者兩個奇數(前提是保證a[]中偶數或者奇數的個數大於2),這樣a[]中偶數和奇數的個數也還是偶數,組合後gcd( b[] )必定大於2。
代碼如下
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <map>
#include <unordered_map>
#include <queue>
#include <vector>
#include <set> 
#include <algorithm>
#include <iomanip>
#define LL long long
using namespace std;
const int N=2e3+5;
int a[N],ji[N],ou[N];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		int cnt1=0,cnt2=0;	//統計a[]中偶數和奇數的個數
		for(int i=1;i<=2*n;i++)
		{
			cin>>a[i];
			if(a[i]&1) ji[cnt1++]=i;
			else ou[cnt2++]=i;
		}
		if(cnt1%2)	//奇數的個數爲奇數的情況(刪除一奇一偶)
		{
			for(int i=0;i<cnt1-1;i+=2)
				cout<<ji[i]<<' '<<ji[i+1]<<endl;
			
			for(int i=0;i<cnt2-1;i+=2)
				cout<<ou[i]<<' '<<ou[i+1]<<endl;
		}
		else if(cnt1>=2)	//奇數的個數爲偶數,且奇數個數大於2的情況(刪除兩個奇數)
		{
			for(int i=0;i<cnt1-2;i+=2)
				cout<<ji[i]<<' '<<ji[i+1]<<endl;
				
			for(int i=0;i<cnt2;i+=2)
				cout<<ou[i]<<' '<<ou[i+1]<<endl;
		}
		else  //奇數的個數爲偶數,且偶數個數大於2的情況(刪除兩個偶數)
		{
			for(int i=0;i<cnt1;i+=2)
				cout<<ji[i]<<' '<<ji[i+1]<<endl;
				
			for(int i=0;i<cnt2-2;i+=2)
				cout<<ou[i]<<' '<<ou[i+1]<<endl;
		}
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章