基础算法题——Harder Gcd Problem(数论、思维)

2023-10-27

题目

题目链接
给定一个 n,将 2~n 内的数进行一对一匹配,每个数仅能利用一次。
假设 a 与 b 匹配,则 gcd(a,b) != 1。现求 2~n 内最大匹配数量,并输出匹配数对。

输入
T代表输入组数。
下面T行,每一行一个数字n。

输出
输出最大匹配数量 m
下面m行,每一行一对匹配数对

示例1
输入样例
2
4
10
输出样例
1
2 4
4
3 9
5 10
8 2
4 6


解题思路

数论知识:合数一定能够通过质数相乘得到。

总体思路

  • 将 n 以内的质数尽量匹配。
  • 通过质数将合数尽量匹配。

逐步分析
①、筛选出质数存储在数组 p 中。

②、在 p 中寻找到最大小于 n/2 的质数下标 pos。

③、从大到小枚举 p 数组中下标 pos~0 的数。
(质数越大越难匹配成功,将难匹配成功的质数先匹配)

思考

我们知道一定存在 2 * p[i] <= n ,但我们并不知道,在 n 内是 p[i] 的倍数数量 x 是多少 ?
(ps:假设p[i]=3,那么在10内 x = 3,分别为3,6,9)

为了方便数字匹配,我们要提前保留一个2 * p[i]。若 x 为偶数,那么则将 2 * p[i] 这个数加入匹配,否则则舍弃 2 * p[i]。

④、枚举完 n/2 以内所有质数,在合数一定能够通过质数相乘得到的条件下,直接输出结果。


实现代码

#include<bits/stdc++.h>
#define ll long long;
using namespace std;
const int N=2e5+5;
int p[N], ans[N], tot, cnt;
bool judge[N], vis[N];

void init(){
    int n=2e5;
    for(int i=2;i<=n;i++){
        if(judge[i]==false){
			p[cnt++]=i;		//存储质数 
        	for(int j=2; j*i<=n;j++){
        		judge[i*j] = true;
        	}
        }
    }
}

int main(){
	int t;
    init();
    scanf("%d",&t);
    while(t--){
    	int n;
    	tot=0;
        scanf("%d",&n);
        memset(vis, false, sizeof(vis));
        
		//找到最大符合条件的质数下标 
        int pos = upper_bound(p, p+cnt, n/2) - p - 1;
        
        for(int i=pos; i>=0; i--){	
        	//将 p[i] 的倍数的数进行匹配 
            for(int j=p[i]; j<=n; j+=p[i]){
            	//若 j 已经匹配过则跳过 或 j==2*p[i] 
                if(vis[j]==true||j==p[i]*2){
					continue;
				}
                ans[++tot] = j;
				vis[j] = true;
            }
            
            //若p[i]倍数匹配完,tot为奇数,还差一个配对
			//对应的数直接取2*p[i] 
            if(tot%2){
				vis[p[i]*2] = true;
				ans[++tot] = p[i]*2;
			}
        }
        printf("%d\n",tot/2);
        
        for(int i=1;i<=tot;i+=2){
			printf("%d %d\n", ans[i], ans[i+1]);
		}
    }
    return 0;
}

如果文章对你有帮助,请给我个赞吧:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基础算法题——Harder Gcd Problem(数论、思维) 的相关文章

随机推荐

  • C开发工程师

    岗位职责 1 完成软件系统代码的实现 编写代码注释和开发文档 2 辅助进行系统的功能定义 程序设计 3 根据设计文档或需求说明完成代码编写 调试 测试和维护 4 分析并解决软件开发过程中的问题 5 协助测试工程师制定测试计划 定位发现的问题
  • 51入门详解教程系列之IO口的输入和输出

    一 IO口的输入 1 分类 1 基本输入IO电路 2 施密特触发输入电路 3 弱上拉输入电路 2 各种的优缺点 1 基本输入IO电路 1 gt 优点 不接VCC GND 在低功耗模式下 不费电 2 gt 缺点 输入不稳定 发生抖动 所以一般
  • Scanner中next与nextLine区别

    区别一 String st1 scanner nextLine String st2 scanner next System out println nextLine方式输入 st1 System out println next方式输入
  • unity中暂停游戏

    做做笔记 本方法出自unity官方案例精讲中的第十二章 private bool paused false void Update if Input GetKeyUp KeyCode P paused paused if paused Ti
  • Flink CDC 基于mysql binlog 实时同步mysql表(无主键)

    环境说明 flink 1 15 2 mysql 版本5 7 注意 需要开启binlog 因为增量同步是基于binlog捕获数据 windows11 IDEA 本地运行 具体前提设置 请看这篇 包含 binlog 设置 Maven Flink
  • server2008 服务器文件共享加密,使用secWall端口加密控制Server2016的文件共享服务...

    使用secWall端口加密控制Server2016的文件共享服务 万华数据 环境 文件服务器 Windows Server 2016 2012 2008 客户端 所有支持的系统 目标 通过在服务器端设置secWall端口加密 让没有正常登录
  • http协议与Apache

    1 http协议 0 监听 扩展 yum install nc 双端安装 nc l 80 服务器监听80端口 nc 192 168 64 100 80 客户端访问80端口 1 http概念 互联网 是网络的网络 是所有类型网络的母集 因特网
  • 喜讯!AntDB数据库入围上海信创公共服务平台产品目录

    近日 AntDB数据库完成信息技术应用创新产品适配 成功入围上海信创公共服务平台产品目录 此次产品目录的入围 再次验证了AntDB数据库符合信息技术应用创新产品可控性要求 也肯定了AntDB数据库团队近20年的数据库研发 服务能力 图1 A
  • GT20L16S1Y字库IC驱动

    GT20L16S1Y字库IC驱动 file GT20L16S1Y c date 2020 7 7 author aron566 copyright None brief GD20L16S1Y字库驱动 details version V1 0
  • ctfshow--网络迷踪

    前言 记录一下做题过程 如有不当之处 还望指正 如有疑问 欢迎留言 目录 前言 1 新手上路 2 初学乍练 3 初学又练 4 初学再练 5 现拉现吃 6 初窥门径 7 狗哥去哪 8 国足加油 9 致我超吧 10 山外有山 11 密集恐惧 1
  • C++Primer第五版课后习题答案目录

    本帖用来记录我在看C Primer第五版时课后习题的代码以及书中一些问题的思考 仅供参考 水平有限 如有错误之处 请大家不吝指教 谢谢 目录 第一章 开始 第二章 变量和基本类型 第三章 字符串 向量和数组 第四章 表达式 第五章 语句
  • Linux 命令之 - scp(从远端机器拉取数据)

    scp是secure copy的简写 用于在Linux下进行远程拷贝文件的命令 和它类似的命令有cp 不过cp只是在本机进行拷贝不能跨服务器 而且scp传输是加密的 命令格式 scp 参数 原路径 目标路径 从本地服务器复制到远程服务器 需
  • 网易滑块验证

    之前在写瑞数专题一时就想发一篇关于网易滑块验证的案例 奈何现在的大佬好像比较喜欢瑞数 不管咋样 还是来水一篇网易滑块验证相关的文章 首先是获取图片的部分参数 fp cb callback这三个都是加密而来 图片验证这里的acToken可以不
  • 聊聊分布式任务调度系统

    我看过那么多所谓的教程 大部分都是教 如何使用工具 的 没有多少是教 如何制作工具 的 能教 如何仿制工具 的都已经是凤毛麟角 中国 软件行业 缺的是真正可以 制作工具 的程序员 而绝对不缺那些 使用工具 的程序员 这个业界最不需要的就是
  • 二、三层转发原理(多例详解,图文相结合说明ping过程)

    首先要了解 源主机在发起通信之前 会将自己的IP与目的主机的IP进行比较 如果两者位于同一网段 用网络掩码计算后具有相同的网络号 那么源主机发送arp请求广播报 请求目的主机的mac地址 在收到目的主机的ARP应答后获得对方的物理层 MAC
  • mysql 错误代码1171

    在创建主键id的时候没有取消上图的允许空值 导致报错1171 Error All part of primary key must be not null when installing flag module 转载于 https www
  • 一位股市天才的肺腑独白:一直只用MACD指标来炒股

    在股市投资中 MACD指标作为一种技术分析的手段 得到了投资者的认知 但如何使用MACD指标 才能使投资收益达到最佳境界 却是知者甚微 在股市操作中 MACD指标在保护投资者利益方面 远超过它发现投资机会的功效 如何巧用MACD指标 在股海
  • linux 重启服务器命令

    Linux有如下的关机和重启命令 shutdown reboot halt poweroff 那么它们有什么区别呢 shutdown 建议使用的命令 shutdown是最常用也是最安全的关机和重启命令 它会在关机之前调用fsck检查磁盘 其
  • 计算机系统基础摘记——程序的链接

    目录 1 初探链接 1 1 可执行文件的生成过程 1 2 链接器的由来 1 3 概述链接器的关键作用 1 4 链接带来的好处 2 目标文件 2 1 一些基本概念 2 2 可重定位文件 2 2 1 可重定位文件的格式 2 2 2 ELF头的格
  • 基础算法题——Harder Gcd Problem(数论、思维)

    题目 题目链接 给定一个 n 将 2 n 内的数进行一对一匹配 每个数仅能利用一次 假设 a 与 b 匹配 则 gcd a b 1 现求 2 n 内最大匹配数量 并输出匹配数对 输入 T代表输入组数 下面T行 每一行一个数字n 输出 输出最