博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【NOIP模拟】密码
阅读量:5051 次
发布时间:2019-06-12

本文共 1148 字,大约阅读时间需要 3 分钟。

题面

闲聊

暴力分也给的太少了,刁钻

而且为什么菲鲁特不配拥有姓名??给我菲鲁特宝一个大大的姓名

好了不BB了

第一题都挂我也不配拥有姓名。。

分析

其实你会发现密码串b的gcd会构成一个N*N的gcd矩阵,而对角线上的数字正是b序列

而这个gcd矩阵其实就是未被打乱前的a序列

而又要满足不下降,还有一个很显然的结论 a,b≤gcd(a,b)

因此b[1]一定是矩阵中最大的数(默认数组从1开始编号),b[2]一定是第二大的。(对角线上数的需要满足不上升,所以一定比他们小。而比他们小的数的gcd也比他们小)

那么b[3]是否是第三大呢?不一定。除了b[1]和b[2]之外,只可能b[1]和b[2]的gcd比它大。

因此衍生出去,当我们每次求到一个b[i]后,需要把a序列中的gcd(b[i],b[j])(j≤i)全部删掉(每次删两个),再找到一个最大的作为b[i+1]

因为ai在1e9以内,所以又得用map这坑货

复杂度:O(?2 LogN)

代码

  1. #include<bits/stdc++.h>  
  2. using namespace std;  
  3. #define N 1010  
  4. #define RT register  
  5. int n,n2,cnt;  
  6. int a[N*N],b[N],ans[N],bc[N];  
  7. map<int,int>mp;  
  8. template<class T>  
  9. inline void read(T &x)  
  10. {  
  11.     x=0;int f=1;static char ch=getchar();  
  12.     while(ch<'0'||ch>'9'){
    if(ch=='-')f=-1;ch=getchar();}  
  13.     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}  
  14.     x*=f;  
  15. }  
  16. inline int gcd(int a,int b){
    return b?gcd(b,a%b):a;}  
  17. int main()  
  18. {  
  19.     read(n);n2=n*n;  
  20.     for(RT int i=1;i<=n2;++i)read(a[i]),mp[a[i]]++;  
  21.     sort(a+1,a+1+n2);  
  22.     for(RT int i=n2;i>=1;i--)  
  23.         while(mp[a[i]])  
  24.         {  
  25.             ans[++cnt]=a[i];mp[a[i]]--;  
  26.             for(int j=1;j<cnt;j++)  mp[gcd(a[i],ans[j])]-=2;  
  27.         }  
  28.     for(RT int i=1;i<=n;++i)printf("%d ",ans[i]);  
  29.     return 0;  
  30. }  

转载于:https://www.cnblogs.com/NSD-email0820/p/9869632.html

你可能感兴趣的文章
二分图匹配 学习笔记
查看>>
poj 2154:Color【polya计数,Euler函数】
查看>>
【转】前台和后台线程
查看>>
洛谷 P1964 【mc生存】卖东西
查看>>
纯CSS制作自适应分页条-分享------彭记(019)
查看>>
VS WebDev.WebServer40
查看>>
openjudge 2971:抓住那头牛 解题报告
查看>>
如何实现redis集群?
查看>>
架构中的集成难点
查看>>
正则表达式
查看>>
liunx系统虚拟机下安装tomcat9以及访问tomcat案例
查看>>
Oracle 插入Date数据
查看>>
word文档操作
查看>>
UIpageControl
查看>>
js判断是否为IE浏览器,是返回true,否返回false
查看>>
Linux性能分析 vmstat基本语法
查看>>
SpringMVC框架学习笔记(2)——使用注解开发SpringMVC
查看>>
深入理解递归函数的调用过程
查看>>
《在C#中实现Socket端口复用》 以及《 UDP 一个封锁操作被对 WSACancelBlockingCall 的调用中断。》问题...
查看>>
PDF格式的“在线阅读”和“下载”
查看>>