题目相当于问1-n中最多能选出多少对不互素无交集的二元组,并要求方案
构造:将所有数放入其最小质因子对应的集合,若素数p所对应的集合元素个数为奇数且$p\ne 2$且$2p\le n$,那么就将$2p$从2对应的集合移到p对应的集合,最终每一个集合中选择$\frac{|S|}{2}$(下取整)对即可
关于这一构造的正确性证明:
1.合法性:素数p所对应的集合中的每一个元素都有公素因子p,因此两两不互素;同时每一个数最多只存在于一个集合,因此不会重复
2.最优性:首先对于$2p>n$的素数p和1都无法参与答案,那么剩余元素的最小质因子一定在$[2,\frac{n}{2}]$中,而通过构造中的调整一定可以使得$(2,\frac{n}{2}]$中的集合元素个数都为偶数,因此最多剩下1个数,不存在更多的匹配

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 vector<int>v,ans[N];
5 int E,t,n,p[N],mn[N],vis[N],bl[N];
6 int main(){
7 for(int i=2;i<N-4;i++){
8 if (!vis[i]){
9 p[++p[0]]=i;
10 mn[i]=i;
11 }
12 for(int j=1;(j<=p[0])&&(i*p[j]<N-4);j++){
13 vis[i*p[j]]=1;
14 mn[i*p[j]]=p[j];
15 if (i%p[j]==0)break;
16 }
17 }
18 scanf("%d",&t);
19 while (t--){
20 scanf("%d",&n);
21 for(int i=1;i<=n;i++)vis[i]=0;
22 for(int i=2;i<=n;i++){
23 vis[mn[i]]++;
24 bl[i]=mn[i];
25 }
26 for(int i=1;(i<=p[0])&&(p[i]<=n);i++)
27 if ((vis[p[i]]&1)&&(p[i]<=n/2))bl[2*p[i]]=p[i];
28 for(int i=1;i<=n;i++)ans[i].clear();
29 for(int i=2;i<=n;i++)ans[bl[i]].push_back(i);
30 int sum=0;
31 for(int i=2;i<=n;i++)sum+=ans[i].size()/2;
32 printf("%d\n",sum);
33 for(int i=1;(i<=p[0])&&(p[i]<=n);i++)
34 for(int j=0;j+1<ans[p[i]].size();j+=2)printf("%d %d\n",ans[p[i]][j],ans[p[i]][j+1]);
35 }
36 }
 

[nowcoder5669H]Harder Gcd Problem的更多相关文章

  1. 【算法系列学习】codeforces C. Mike and gcd problem

    C. Mike and gcd problem http://www.cnblogs.com/BBBob/p/6746721.html #include<iostream> #includ ...

  2. CF798 C. Mike and gcd problem

    /* CF798 C. Mike and gcd problem http://codeforces.com/contest/798/problem/C 数论 贪心 题意:如果一个数列的gcd值大于1 ...

  3. Codeforces Round #410 (Div. 2)C. Mike and gcd problem

    题目连接:http://codeforces.com/contest/798/problem/C C. Mike and gcd problem time limit per test 2 secon ...

  4. codeforces#410C Mike and gcd problem

    题目:Mike and gcd problem 题意:给一个序列a1到an ,如果gcd(a1,a2,...an)≠1,给一种操作,可以使ai和ai+1分别变为(ai+ai+1)和(ai-ai+1); ...

  5. Codeforces 798C. Mike and gcd problem 模拟构造 数组gcd大于1

    C. Mike and gcd problem time limit per test: 2 seconds memory limit per test: 256 megabytes input: s ...

  6. #410div2C. Mike and gcd problem

    C. Mike and gcd problem time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  7. Codeforces 798C - Mike and gcd problem(贪心+数论)

    题目链接:http://codeforces.com/problemset/problem/798/C 题意:给你n个数,a1,a2,....an.要使得gcd(a1,a2,....an)>1, ...

  8. FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2224 同hdu5869 //#pragma comment(linker, "/STACK:1024 ...

  9. 【codeforces 798C】Mike and gcd problem

    [题目链接]:http://codeforces.com/contest/798/problem/C [题意] 给你n个数字; 要求你进行若干次操作; 每次操作对第i和第i+1个位置的数字进行; 将 ...

随机推荐

  1. caffe转换变量时的gflags问题

    先解决错误7,解决方式来自于http://blog.csdn.net/wishchin/article/details/51888566这篇博文,感谢博主 只需要添加上 #pragma comment ...

  2. ansible远程运维操作

    1.command 用于查看文件内容,查看磁盘,内存,启动命令等纯命令信息 ansible portal -m command -a "cat /test1/test"2.ping ...

  3. 阿里 Midway 正式发布 Serverless v1.0,研发提效 50%

    Github:https://github.com/midwayjs/midway 开源为了前端和 Node.js 的发展,点 Star! 去年阿里提出 Serverless 架构,并利用其新一代研发 ...

  4. RabbitMQ持久化机制、内存磁盘控制(四)

    一.持久化 如果看到这一篇文章的朋友,都是有经验的开发人员,对持久化的概念就不用再做过多的解析了,经过前面的几篇文章,其实不难发现RabbitMQ 的持久化其实就只分交换器持久化.队列持久化和消息持久 ...

  5. VS2017离线安装QT插件出错:未能正确加载VSIX包

    问题现象: 问题已解决,忘记截图了 出现原因:可能是自己离线安装,安装版本与不符合当前VS吧.记得当时下载了一个最新的版本.重新卸载当前插件,再装一个合适版本即可 http://download.qt ...

  6. Rigidbody钢体移动时抖动问题

    Rigidbody移动时抖动问题 撞墙抖动 Unity中物体移动有非常多的方式: 比如: transform.position += dir*speed*Time.deltaTime; transfo ...

  7. Mybatis 动态Sql练习

    建表 CREATE TABLE `student` ( `s_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT ...

  8. [no code][scrum meeting] Beta 8

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月22日15:30,主持者:赵涛 下次例会时间:5月23日11:30,主持者:肖思炀 一.工作汇 ...

  9. S 锁与 X 锁的爱恨情仇《死磕MySQL系列 四》

    系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强 ...

  10. Python3 装逼神器---词云(wordcloud)

    词云 (Word Cloud)是对文本中出现频率较高的词语给予视觉化展示的图形, 是一种常见的文本挖掘的方法. 实例:     依赖包: # pip3 install wordcloud  jieba ...