题意简述:

给定一个长度为$n$的序列 将这个序列里的数两两求$gcd$得到$n^2$个数

将这$n^2$个数打乱顺序给出 求原序列的一种可能的情况

-----------------------------------------------------------------------------------------------------------------------

比赛时一直去想有什么特殊的性质(找规律) 比如这些数里为一个数的倍数的数一定是平方个

然而按照这样的思路去想又会有什么分解因式等等 最后直接在这一部分就T掉

-----------------------------------------------------------------------------------------------------------------------

比赛结束后$ dwj$ 给了我一份他的$AC$代码 发现原来是增量法的运用

我们先假设原序列是非严格递减的

我们把这些数排序后 设已经求得原序列前$k$项 并且把前$k$项相互之间的$gcd$得到的数全部删掉了

剩下来的最大的那个肯定是原序列中的$k+1$项

然后通过这个数和前$k$项的数$gcd$得到的数我们把它们全部删掉

剩下来的最大的那个肯定是原序列中的$k+2$项

…………

对于删数的操作 我们可以用优先队列来维护 然后这题就解决了

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N=;
int a[N*N],ans[N];
int n,len;
priority_queue <int> q;
int main()
{
scanf("%d",&n);
int n2=n*n;
for(int i=;i<=n2;++i)
scanf("%d",&a[i]);
sort(a+,a++n2);
int i=n2;
while(i)
{
if(q.empty()||q.top()!=a[i])
{
for(int j=;j<=len;++j)
{
q.push(__gcd(ans[j],a[i]));
q.push(__gcd(ans[j],a[i]));
}
printf("%d ",ans[++len]=a[i]);
}
else
q.pop();
--i;
}
return ;
}

最新文章

  1. ssh模仿ansible批量执行命令的功能
  2. php ajax请求和返回
  3. Appium学习实践(一)简易运行Appium
  4. 【微信Java开发 --番外篇】错误解析
  5. Yii javascript 的结合 账号禁用 激活 的设置。
  6. oracle——表修改语句集合
  7. App抓包数据包之Paros的安装及使用
  8. PKU-1704-Georgia and Bob
  9. 数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
  10. String 类中的几个练习--获取指定字符串中,大写字母、小写字母、数字的个数||获取一个字符串中,另一个字符串出现的次数
  11. java中的线程问题(三)——继承Thread VS 实现Runnable的区别
  12. springBoot 整合mybaits 逆向工程
  13. 大数据时代——为什么用HADOOP?
  14. SAP跟踪前台操作导致的后台查询语句
  15. 模拟赛T1 素数
  16. Linux下php安装Redis安装
  17. C#单例的多种写法
  18. linux查看网卡驱动
  19. mysql和mysql jdbc连接器mysql-connector-java对应关系
  20. 委托,事件,lambda表达式

热门文章

  1. CPU高速缓存行与内存关系 及并发MESI 协议(转载)
  2. JavaScript Is or isNot
  3. securecrt(CRT)导入会话
  4. &lt;转载&gt;面试官,不要再问我三次握手和四次挥手
  5. 12、numpy——数学函数
  6. python学习第十五天字典的创建及增删改查操作方法
  7. python学习第五天流程控制分支if和循环while
  8. 如何学习 websocket ?
  9. XMPP即时通讯协议使用(十三)——获取当前在线用户或关闭指定用户
  10. linux性能分析工具Procs