Code Forces 582 A. GCD Table(数论)
2015-10-09 22:44
274 查看
Description
由n个数,可以构成n*n的gcd矩阵,无序的输入这n*n个数,然后让你找到这n个数,满足这个gcd矩阵
Input
第一行为一整数n表示数的个数,第二行n*n个整数表示这n个数gcd矩阵里的所有元素值
Output
输出满足输入的gcd矩阵的n个数
Sample Input
4
2 1 2 3 4 3 2 6 1 1 2 2 1 2 3 2
Sample Output
4 3 6 2
Solution
最大的数字肯定是满足条件的数,我们就选择最大的数,然后让这个数和前面取到的数,都会产生两个gcd,于是就在数列中把这两个gcd删去就好了,每两个数之间,一定会产生两个gcd的,但是直接用数组记录数字会爆所以用map
Code
由n个数,可以构成n*n的gcd矩阵,无序的输入这n*n个数,然后让你找到这n个数,满足这个gcd矩阵
Input
第一行为一整数n表示数的个数,第二行n*n个整数表示这n个数gcd矩阵里的所有元素值
Output
输出满足输入的gcd矩阵的n个数
Sample Input
4
2 1 2 3 4 3 2 6 1 1 2 2 1 2 3 2
Sample Output
4 3 6 2
Solution
最大的数字肯定是满足条件的数,我们就选择最大的数,然后让这个数和前面取到的数,都会产生两个gcd,于是就在数列中把这两个gcd删去就好了,每两个数之间,一定会产生两个gcd的,但是直接用数组记录数字会爆所以用map
Code
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<map> #include<vector> using namespace std; #define maxn 500*500+1 int a[maxn]; map<int,int>m; vector<int>ans; int gcd(int a,int b) { if(a<b)return gcd(b,a); if(b==0)return a; return gcd(b,a%b); } int main() { int n; while(~scanf("%d",&n)) { ans.clear(); for(int i=1;i<=n*n;i++) { scanf("%d",&a[i]); m[a[i]]++; } sort(a+1,a+n*n+1); for(int i=n*n;i>0;i--) { if(m[a[i]]==0)continue; m[a[i]]--; for(int j=0;j<ans.size();j++) { int temp=gcd(ans[j],a[i]); m[temp]-=2; } ans.push_back(a[i]); } for(int i=0;i<ans.size();i++) printf("%d ",ans[i]); printf("\n"); } return 0; }
相关文章推荐
- 天声人語 20151009 ペンギン100年
- ios笔记UI--汤姆猫小项目(UIbutton使用)
- Java类什么时候开始初始化
- 二维数组与冒泡排序2
- java类和对象的基础(笔记)
- C++Primer第五版 练习11.23(解答)
- 【leetcode】Merge k Sorted Lists(TLE)
- 在C语言中 宏定义是什么?
- hpux DRD克隆软件版本升级说明
- C++primer第五版笔记-第九章顺序容器
- 【NPOI】类库
- 使用XAMPP和Wordpress搭建一个属于你自己的网站
- C++Primer第五版 练习11.20(解答)
- iOS:手势的详解UIGestureReconizer
- iOS 9 适用 修改状态栏
- C++Primer第五版 11.3.2节练习
- PopupWindow 属性,我们的使用的途径
- hpux 根盘镜像
- MQ MI多实例安装配置
- iOS界面编程-UIActionSheet