题意简述

给出正整数n,你要把1-n之间的正整数分成尽可能多组,使得每一组两个数的最大公约数大于1;输出能分成最多组的个数,并按任意顺序输出每组的两个数.

很妙的一道题。

首先我们考虑去处理每个质数的倍数,那么这个质数一定是小于等于 n/2 的,不然它在 n 的范围内是不会有倍数的。

那么我们先把 $1~n/2$ 范围内的所有质数筛出来。

枚举质数

然后我们要怎么用质数去处理答案呢?

首先我们从大到小枚举这些质数,然后去枚举它的倍数。

然鹅这样复杂度不会炸么?不会。 $O(\sigma_{i=2}^{n/2}n/i)$ 的复杂度吧,而且还远达不到。

信仰一下应该是过得了的,实际上确实也过了。

处理倍数

然后我们再考虑如果这些倍数该怎么处理。

我们首先看这些倍数有没有被使用过,没有的话就入栈。

最优性理解

那么为什么能用就入栈的解法最优呢?

其实很简单,因为当前枚举那个数可以被当前的质数整除,那么该数与当前枚举质数的倍数去匹配肯定不会产生更劣的结果。

那么如果有数字剩下来呢?

如果说当前枚举质数的未使用过的倍数有奇数个,那么我们可以将第 2 个倍数与最后一个换一下,然后弹出栈,标记为未使用。

为什么这样做能达到最优?

考虑第二个倍数一定是 2 的倍数,那么把他弹出的话就可以和 2 的倍数去匹配,而且我们每次遇到奇数个的情况都是弹 2 的倍数,那么这些多余的数就可以凑一块儿了。

 1 //by Judge
2 #include<vector>
3 #include<cstdio>
4 #include<iostream>
5 #define P make_pair
6 using namespace std;
7 const int M=1e5+11;
8 char sr[1<<21],z[20];int C=-1,Z;
9 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
10 inline void print(int x,char chr='\n'){
11 if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
12 while(z[++Z]=x%10+48,x/=10);
13 while(sr[++C]=z[Z],--Z);sr[++C]=chr;
14 } int n,cnt,ans,top,prim[M],is[M],vis[M],num[M];
15 pair<int,int> tmp[M];
16 inline void prep(){
17 for(int i=2;i<=n>>1;++i){
18 if(!is[i]) prim[++cnt]=i;
19 for(int j=1;j<=cnt&&i*prim[j]<=n/2;++j){
20 is[i*prim[j]]|=1;
21 if(i%prim[j]==0) break;
22 }
23 }
24 }
25 int main(){
26 scanf("%d",&n),prep();
27 for(int i=cnt;i;--i){ top=0;
28 for(int j=prim[i];j<=n;j+=prim[i])
29 if(!vis[j]) num[++top]=j,vis[j]|=1;
30 if(top&1) swap(num[2],num[top]),vis[num[top]]=0,--top;
31 for(int j=1;j<=top;j+=2) tmp[++ans]=P(num[j],num[j+1]);
32 } print(ans);
33 for(int i=1;i<=ans;++i)
34 print(tmp[i].first,' '),
35 print(tmp[i].second);
36 return Ot(),0;
37 }

CF449C:Jzzhu and Apples的更多相关文章

  1. CF449C:Jzzhu and Apples——题解

    https://vjudge.net/problem/CodeForces-449C 题目大意:1-n编号的苹果两两一对,他们的最大公约数不为1,求这些对的最大匹配. ———————————————— ...

  2. Codeforces Round #257 (Div. 2) E题:Jzzhu and Apples 模拟

    E. Jzzhu and Apples time limit per test 1 second memory limit per test 256 megabytes input standard ...

  3. Codeforces 450E:Jzzhu and Apples(构造,数学)

    E. Jzzhu and Apples time limit per test: 1 seconds memory limit per test: 256 megabytes input: stand ...

  4. CF449C Jzzhu and Apples (筛素数 数论?

    Codeforces Round #257 (Div. 1) C Codeforces Round #257 (Div. 1) E CF450E C. Jzzhu and Apples time li ...

  5. Codeforces 449.C Jzzhu and Apples

    C. Jzzhu and Apples time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. CF449 C. Jzzhu and Apples

    /* http://codeforces.com/problemset/problem/449/C cf 449 C. Jzzhu and Apples 数论+素数+贪心 */ #include &l ...

  7. Codeforces 449C Jzzhu and Apples 贪心 (看题解)

    Jzzhu and Apples 从大的质因子开始贪心, 如果有偶数个则直接组合, 如果是奇数个留下那个质数的两倍, 其余两两组合. #include<bits/stdc++.h> #de ...

  8. CF 450E Jzzhu and Apples 数学+模拟

    E. Jzzhu and Apples time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. CF449C Jzzhu and Apples

    嘟嘟嘟 这道题正解是怎么对的其实我也不清楚,总之靠感性理解吧. 首先当然要把1到n / 2的素数都筛出来,因为两两能配对的数一定都是这些素数的倍数.这也就说明对于(n / 2, n]的素数,他们一定不 ...

随机推荐

  1. linux kill 命令【待完善】【转】

    kill 命令用来处理进程, 在linux中即可使用kill -9 pid 杀死进程 , 也可使用kill -KILL pid 等价的命令来执行. HUP 1 终端断线 INT 2 中断(同 Ctrl ...

  2. Timus 1132 Square Root(二次剩余)

    http://acm.timus.ru/problem.aspx?space=1&num=1132 题意: 求 x^2 ≡ n mod p  p是质数 的 解 本题中n>=1 特判p=2 ...

  3. Linux命令(十二)制作静态库和共享库

    1. 静态库 静态库文件命名:libxxxx.a 1.1 步骤: ar rcs libCalc.a *.o 1.2 用nm查看文件内容 1.3 发布并使用 gcc main.c -o mycpp.ou ...

  4. 11-SQLServer的事务、存储过程和触发器

    一. 事务 在SQLServer中,每条SQL语句,默认就是一条隐式的事务,但是如果我们需要一组SQL语句,那么就需要采用SQLServer提供的特有的标记 来声明事务的开始.提交和回滚了. 事务的开 ...

  5. StringBuilder类

    java.lang.StringBuilder String类代表字符串,他的底层是一个被final修饰的数组,不能改变,字符串是常量,它们的值一旦被创建之后就不能改变,但是字符串缓冲区(String ...

  6. vue 高德地图使用 vue-amap

    此插件文档及使用还不错 https://elemefe.github.io/vue-amap/ <template> <div class="amap-page-conta ...

  7. bean的装配方式(注入方式,构造注入,setter属性注入)

    bean的装配方式有两种,构造注入和setter属性注入. public class User { private String username; private String password; ...

  8. Python之进程 2 - multiprocessing模块

    ​ 我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说, ...

  9. steps/train_mono.sh

    <<单音素HMM的训练流程图.vsdx>> 定义拓扑结构.参数初始化 $ gmm-init-mono --shared-phones=$lang/phones/sets.int ...

  10. 强网杯2018 Web签到

    Web签到 比赛链接:http://39.107.33.96:10000 比赛的时候大佬对这题如切菜一般,小白我只能空流泪,通过赛后看别人的wp,我知道了还有这种操作. 这个赛题分为3层 第一层 Th ...