题目大意:

有一个数组 a 其中有 2n 个数,把它压缩进数组 b,b 的大小是 n-1。

所谓的“压缩”指的是两种操作:

  • 首先舍弃 a 当中的两个数(你可以任意选择)。
  • 然后每次取出剩下的数组 a 当中的两个数,把他们的和放入数组 b 当中。

要求最终 b 数组中所有数的最大公约数(gcd)要大于 1,即 gcd{b_1,b_2,...,b_n-1}>1

请你把你每一次从 a 中取出的两个数在原来的 a 中的下标输出,如果答案不唯一输出任意一种即可。

题解:

如题目所说,保证每一组数据都有解,那么为什么一定有解呢?

  首先,给定的序列里,数的种类可以分成奇数和偶数,对于奇数来说,每两个奇数的和是偶数,对于偶数来说,每两个偶数的和也一定是偶数。因此,我们只需要将2n-2个数取出,合并,使每个数都为偶数,即可保证最大公因数至少为二

  那么,我们应该如何取这2n-2个数呢?

  如何取数,受制于数列里奇数和偶数的个数。因为数列里的数的总数为2n为偶数,所以如果奇数的个数为奇数,那么偶数的个数也为奇数,这时候只需要奇数偶数分别扔一个出去即可保证两两之间有符合要求的匹配。如果奇数的个数为偶数,偶数的个数也为偶数,那么随便选奇数或偶数扔两个数出去即可(前提是你选中的这种数的类型(奇数or偶数)所包括的数的个数至少大于或等于二

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2005;
struct p{
int num,pos;
p(){}
p(int nnum,int ppos){
nnum = nnum;
pos = ppos;
}
};//记录数列中每个数的大小和下标
vector<p> j,o;//j记录奇数,o记录偶数
int t,n,a[MAXN],cntj,cnto;
int main(){
cin >> t;
while(t--){
j.clear();
o.clear();
memset(a,0,sizeof a);
cin >> n;
for(int i = 1; i <= 2 * n; i++){
cin >> a[i];
if(a[i] % 2 == 1)j.push_back(p(a[i],i));//存数
else o.push_back(p(a[i],i));
}
if(j.size() % 2 == 0 && o.size() % 2 == 0){//判两种类型的数的个数的情况并进行相应的处理
for(int i = 2; i < j.size(); i+=2){
cout << j[i].pos << " " << j[i + 1].pos<< "\n";
}
for(int i = 0; i < o.size(); i+=2){
cout << o[i].pos<< " " << o[i + 1].pos << "\n";
}
}
else if(j.size() % 2 == 1 && o.size() % 2 == 1){
for(int i = 1; i < j.size(); i+=2){
cout << j[i].pos << " " << j[i + 1].pos << "\n";
}
for(int i = 1; i <o.size(); i+=2){
cout << o[i].pos<< " " << o[i + 1].pos<< "\n";
}
}
}
}

GCD Compression的更多相关文章

  1. Codeforces Round #651 (Div. 2) A Maximum GCD、B GCD Compression、C Number Game、D Odd-Even Subsequence

    A. Maximum GCD 题意: t组输入,然后输入一个n,让你在区间[1,n]之间找出来两个不相等的数a,b.求出来gcd(a,b)(也就是a,b最大公约数).让你求出来最大的gcd(a,b)是 ...

  2. Codeforces Round #651 (Div. 2) B. GCD Compression(数论)

    题目链接:https://codeforces.com/contest/1370/problem/B 题意 给出 $2n$ 个数,选出 $2n - 2$ 个数,使得它们的 $gcd > 1$ . ...

  3. Codeforces Round #651 (Div. 2) B. GCD Compression (构造)

    题意:有一个长度为\(2n\)的数组,删去两个元素,用剩下的元素每两两相加构造一个新数组,使得新数组所有元素的\(gcd\ne 1\).输出相加时两个数在原数组的位置. 题解:我们按照新数组所有元素均 ...

  4. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

    OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...

  5. iOS 多线程之GCD的使用

    在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...

  6. 【swift】BlockOperation和GCD实用代码块

    //BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...

  7. 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!

    多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...

  8. GCD的相关函数使用

    GCD 是iOS多线程实现方案之一,非常常用 英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器 是苹果公司为多核的并行运算提出的解决方案 1.一次性函数 dispatch_once 顾 ...

  9. hdu1695 GCD(莫比乌斯反演)

    题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...

随机推荐

  1. 从旧金山到上海, HTTP/3 非常快!

    HTTP/3 是超文本传输协议 (HTTP) 的第三个版本,它对 Web 性能来说意义重大, 让我们看看HTTP/3 如何让网站的速度变得更快! 等等,HTTP/2 发生了什么? 不是几年前才开始推广 ...

  2. 【Python爬虫案例】用Python爬取李子柒B站视频数据

    一.视频数据结果 今天是2021.12.7号,前几天用python爬取了李子柒的油管评论并做了数据分析,可移步至: https://www.cnblogs.com/mashukui/p/1622025 ...

  3. Docker容器的安装和使用

    Docker容器的安装和使用 安装: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 或国内:curl -sSL ...

  4. 请求扩展、蓝图、g对象

    今日内容概要 请求扩展 蓝图 g对象 内容详细 1.请求扩展 # 在请求来了,请求走了,可以做一些校验和拦截,通过装饰器来实现 7 个 # 1 before_request 类比django中间件中的 ...

  5. 渗透:zANTI

    Zanti简介 Zanti是由Zimperium公司打造的Android平台下的渗透测试工具包. Zanti支持两种中间人攻击方式,分别为MIMT攻击和ARP攻击,中间人内带有多个攻击模块,例如MAC ...

  6. 自学c语言

    C 语言是一种通用的.面向过程式的计算机程序设计语言. 当前最新的 C 语言标准为 C18 前期准备 C 编译器  写在源文件中的源代码是人类可读的源.它需要"编译",转为机器语言 ...

  7. [XJOI3529] 左右

    题目链接:左右 Description 给你一个s数组,一个t数组,你可以对s数组执行以下两种操作 L 操作:每个数等于其左边的数加上自己 R 操作:每个数等于其右边的数加上自己 第一个数的左边是最后 ...

  8. C#语言中的类型转换方法(unfinished)

    一.C#中的数据类型 1.数值类型 2.字符类型 3.字符串类型 4.布尔类型 5.枚举类型 6.Object类型 二.常见的类型转换 从转换方式的角度,类型转换分为隐式转换与显式转换两种. 其中,隐 ...

  9. CentOS切换用户命令su or su+username

    1.打开终端,提示符为"$",表明该用户为普通用户,此时,直接输su,回车,输入root密码,回车,就可以切换到root用户下,此时的提示符变为"#". 注意, ...

  10. 001 手把手用Git,Git从入门到上传本地项目到Github,看这篇就够了

    安装git 下载Git 下载好后,一路next即可 安装好后,打开Git bash,进行配置 首先配置自己的身份 git config --global user.name "Name&qu ...