我看了一下题解好像有人也这么做的,求各位巨佬帮忙看看QAQ
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int PrNum = 3245;
const int prime[PrNum] = {30000以内质数表(太长了不放了)};
int n, m1, m2, s, ans = INF;
struct node
{
int x, cnt;
};
vector<node> m, t;
int f()
{
int res = 0;
for (int i = 0, j = 0; i < m.size() && j < t.size(); ++j)
{
if (t[j].x < m[i].x) // Next
continue;
if (t[j].x > m[i].x) // Havent
return INF;
res = max(res, (int)ceil(m[i].cnt / (t[j].cnt * 1.0))); // Can
++i; //Pass this
}
return res;
}
void Split(int x, vector<node> &vec)
{
vec.clear();
int cnt;
for (int i = 0; i < PrNum && x > 1; i++)
{
cnt = 0;
while (!(x % prime[i]) && x)
{
cnt++;
x /= prime[i];
}
vec.push_back((node){prime[i], cnt});
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m1 >> m2;
Split(m1, m);
for (int i = 0; i < m.size(); i++)
m[i].cnt *= m2;
while (n--)
{
cin >> s;
Split(s, t);
ans = min(ans, f());
}
cout << (ans == INF ? -1 : ans);
return 0;
}