40分蒟蒻又来了,感觉自己码力越来越差了
#include <bits/stdc++.h>
using namespace std;
const int maxn = 30010;
int n, m1, m2, k, cnt, t, ans = 1 << 30;
int prime[maxn];//打表素数
int prime_m[maxn];//记录m的因数的个数
int prime_l[maxn];//记录m的因数
int check(int x)
{
int k = sqrt(x);
for(int i = 2 ; i <= k ; i ++)
if(x % i == 0) return false;
return true;
}
int main()
{
scanf("%d %d %d", &n, &m1, &m2);
if(m1 == 1)
{
printf("0");
return 0;
}
for(int i = 2 ; i <= m1 ; i ++)//这里不能开平方优化时间哦,万一m是个质数呢
if(check(i)) prime[++ prime[0]] = i;
for(int i = 1 ; i <= prime[0] ; i ++)
{
if(m1 % prime[i] == 0)
{
while(m1 % prime[i] == 0)
prime_m[prime[i]] += m2, m1 /= prime[i];
prime_l[++ prime_l[0]] = prime[i];
}
}
while(n --)
{
scanf("%d", &k);
t = -1;//万一刚好能除尽,所以t不能赋值0
for(int i = 1 ; i <= prime_l[0] ; i ++)
{
if(k % prime_l[i] != 0) continue;
else
{
cnt = 0;
while(k % prime_l[i] == 0)
{
k /= prime_l[i];
cnt ++;//统计该因数个数
}
t = max(t, (int)ceil((double)prime_m[prime_l[i]] / cnt));
}
}
if(t >= 0) ans = min(ans, t);
}
if(ans == 1 << 30)
{
printf("-1");
return 0;
}
else printf("%d", ans);
return 0;
}
1578四个点过了