1 条题解
-
0
可以复习:
- 求因子
- map作为索引字典的用法。
其他就纯粹是数学脑袋了。
问题:
在m个数中挑n个数,求这n个数可能的最大公约数。
思路:
我们对m个数的所有因子(假设个数为x)进行个数统计:
准备x个盒子,盒子上写上因子,盒子中的小球数为这个因子出现的总次数。 显然,要找“n个数的共同因子”,只要找出所有小球数>n的盒子。 这些盒子里面,编号最大的那个,就是所求的最大公约数。
#include <bits/stdc++.h> using namespace std; map<int, int> mep; void factor(int a) { //为所有因数建立次数索引 for (int i=1; i*i <= a; i++) if (a%i == 0) { mep[i]++; if (a/i!=i) mep[a/i]++; } } int main() { mep.clear(); int n,m,mex=0; cin >> n; for (int i=0; i<n; i++) { cin>>m; factor(m); mex=max(m,mex); } for (int i=1; i<=n; i++){ //对于i,找到所有mep[x]>=i中最大的x(未出现的因数将被跳过) while (mep[mex]<i) mex--; cout<<mex; } return 0; }
- 1
信息
- ID
- 414
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 17
- 已通过
- 5
- 上传者