思路
这题其实很容易想到质因子分解,但是我们只能分解m1^m2的质因子,不能把每个读入的s全部分解开。
对于s来说,只要它的质因子种类包括了所有的m1^m2的质因子种类,这个s就一定可以求出来一个时间,让他们的对应的指数相除取最大,因为初始的时候指数为0,所以用除法。
s只需要分解m1^m2的质因子就可以了,这样速度就上去了。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e5+10;
const int INF=0x3f3f3f3f;
unordered_map<ll,ll> a,b;
int main()
{
ll n,m1,m2,t;
scanf("%lld%lld%lld",&n,&m1,&m2);
if (m1==1) {
ll t;
for (int i=0;i<n;i++) {
scanf("%lld",&t);
}
printf("0
");
return 0;
}
ll i=2;
while (m1!=1) {
while (m1%i==0) {
a[i]++;
m1/=i;
}
if (a.find(i)!=a.end())
a[i]*=m2;
i++;
}
ll ans=INF;
for (int i=0;i<n;i++) {
scanf("%lld",&t);
ll ps=-INF;
bool flag=true;
for (auto p:a) {
if (t%p.first!=0) {
flag=false;
break;
}
ll cnt=0;
while (t%p.first==0) {
cnt++;
t/=p.first;
}
if (p.second>=cnt) {
ll div=p.second/cnt;
if (cnt*div<p.second)
div++;
ps=max(ps,div);
}
else {
ps=max(ps,1LL);
}
}
if (flag) {
ans=min(ans,ps);
}
}
if (ans==INF||ans==-INF) {
printf("-1
");
}
else {
printf("%lld
",ans);
}
return 0;
}
/*
100
12125 1
39703 1 5 53645 457192049 45953 15679 97 1 1 5 5581 324355 84685 41539 5 485 1 97 485 1 339035 97 25 79657 1 1 361519 97 1 1 1 1 97 270533 3780769 1 182795 1 5 16865 68539 3469 1 97 5 1 1 5 26729 97 1 1 247654289 5 1 1 1 97 485 1 97 1 97 1 1 25 36887 99277 5 1 138025 10859635 97 50423 5 18397 1 5 1 836819 84067 607219735 46337 1 97 97 71257 1 97 95803 1 21859 57895 1 1 1 1 25247 1
*/