- 题面
- 题意:见题面。
- 解决思路:由题意可知选出
k
\small k
k个数为
a
1
,
a
2
.
.
.
a
k
−
1
,
a
k
\small a_1,a_2...a_{k-1},a_k
a1,a2...ak−1,ak,题目描述的操作的结果正好是
k
\small k
k个数的线性组合,有裴蜀定理可知,操作后和结果必须是
(
a
1
,
a
2
.
.
.
a
k
−
1
,
a
k
)
\small (a_1,a_2...a_{k-1},a_k)
(a1,a2...ak−1,ak)的倍数,由于外星人所给的燃料肯定是最少的,故
(
a
1
,
a
2
.
.
.
a
k
−
1
,
a
k
)
(a_1,a_2...a_{k-1},a_k)
(a1,a2...ak−1,ak)就是外星人所给的燃料量。
本题的题意转换为:求出 k \small k k个数的最大公约数的最大值。
由于最大公约数都是因子,所以直接对每个数求所有因子,对因子计数,查询哈希表,寻找个数大于 k \small k k的最大因子即可。 - AC代码
//优化
#pragma GCC optimize(2)
//C
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//C++
#include<unordered_map>
#include<algorithm>
#include<iostream>
#include<istream>
#include<iomanip>
#include<climits>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
//宏定义
#define N 1010
#define DoIdo main
//#define scanf scanf_s
#define it set<ll>::iterator
//定义+命名空间
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 19260817;
const ll INF = 1e18;
const int maxn = 1e6 + 10;
using namespace std;
//全局变量
int u[maxn];
unordered_map<int, int>mp;
//函数区
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
void get(int n) {
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
mp[i]++;
if (n / i != i) {
mp[n / i]++;
}
}
}
}
//主函数
int DoIdo() {
ios::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> u[i];
get(u[i]);
}
int mx = 0;
for (auto x : mp) {
if (x.second >= k) {
mx = max(mx, x.first);
}
}
cout << mx << endl;
return 0;
}
//分割线---------------------------------QWQ
/*
*/