题意
1.给我们2*n个数的序列a,刚开始我们可以从中选择两个数丢弃不用,之后在剩下的2*n-2个数中,我们要进行n-1次操作,每次操作我们我们从a中选择两个数,把这两个数的和,放入到b序列中(初始时b为空序列),问最后能否使gcd(b1,b2,…,bn-1)> 1 ?
思路
既然要b中所有元素的gcd>1,那么我们可以构造出所有元素的gcd == 2
为什么一定可以构造出呢?
-
有偶数个奇数,那么也一定有偶数个偶数
这种情况下,舍弃2个奇数或者2个偶数,然后拿奇数和奇数构造,拿偶数和偶数构造,一定可以构造n−1个偶数出来 -
有奇数个奇数,那么也一定有奇数个偶数
分别舍弃一个奇数和一个偶数,然后奇数和奇数构造,偶数和偶数构造,一定可以构造n−1个偶数出来
这样就一定可以构造出所有元素的gcd==2的序列b了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
#include<sstream>
#include<set>
#include<bitset>
#include<vector>
#include<cmath>
using namespace std;
#define ios ios::sync_with_stdio(false)
int dx[]={-1,0,1,0,0},dy[]={0,1,0,-1,0};
typedef pair<int,int> PII;
typedef pair<double,double> pdd;
typedef pair<double,int> pdi;
typedef long long LL;
const int INF=0x3f3f3f3f;
const LL IINF=0x3f3f3f3f3f3f3f3f;
int n;
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n;
vector<int> odd,even;
for(int i=1;i<=2*n;i++)
{
int x;
cin>>x;
if(x & 1) odd.push_back(i);
else even.push_back(i);
}
vector<PII> ans;
for(int i=0;i<(int)odd.size()-1;i+=2)
ans.push_back({odd[i],odd[i+1]});
for(int i=0;i<(int)even.size()-1;i+=2)
ans.push_back({even[i],even[i+1]});
for(int i=0;i<n-1;i++)
cout<<ans[i].first<<' '<<ans[i].second<<endl;
}
//system("pause");
}