You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
4.7 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1010;
/**
*/
//分解质数因子的结果(对试管的数量进行质数因子分解的结果)
struct node {
int number; //质数因子
int count; //质数因子的个数
} a[N];
int idx;//这个idx是配合a[N]使用的下标变量
//试管的总数 M=pow(m1,m2)
int m1; //试管的数量底
int m2; //试管的数量幂
int n; //细胞种数
//预求最小,先设最大
int Min = INF;
/**
2
24 1
30 12
2
24 1 m1=24,m2=1 pow(m1,m2)=pow(24,1)=24
30 12 3012
2
13024=2*2*2*3
30%2=030%3=03024
30121315323303
30233
2112 12*12144144/24=6
*/
int main() {
//读入
cin >> n >> m1 >> m2;
//对x进行分解质数因子
for (int i = 2; i <= m1; i++) {
//如果x可以整除因子i
if (m1 % i == 0) {
a[++idx].number = i; //a数组从下标1开始记录数字
//采用能除尽除的思路
while (m1 % i == 0) {
m1 /= i;
a[idx].count++;//记录质数因子的个数
}
//换算成试管的总数,因为原题是m1^m2,所以可以分解成每个质数因子的m2次方的乘积
a[idx].count *= m2;
}
}
//遍历n类细胞看看谁的分裂时间最快(就是求最小值)能平均分配到试管中
while (n--) {
int s;//每秒钟的分裂个数
cin >> s;
//是否可以成功装入容器的标识
bool flag = true;
//遍历每个m1的质数因子
for (int i = 1; i <= idx; i++)
//一旦发现s在没有分裂前就没有质数因子a[i],那么就永远不可能分裂出m1^m2的倍数了
if (s % a[i].number != 0) {
flag = false;
break;
}
//如果所有质数因子都存在那么就一定可以通过分裂达到一定次数后成为m1^m2的倍数
//如果不是所有质数因子存在那么这种细胞就需要放弃掉了因为永远都不可能放到M个试管中去。
if (flag) {
//这里的最大值初始化为0是有意义的要注意不能使用-INF这样就成功躲过了0
int Max = 0;
//遍历m1的每一个质数因子
for (int i = 1; i <= idx; i++) {
//s中每一个质数因子出现的个数
int cnt = 0;
//分解质因数
while (s % a[i].number == 0) {
s /= a[i].number;
cnt++;
}
//细胞的每秒分裂数s
//s里面质数因子a[i]的个数:cnt
//想在达到或超过的质数因子a[i]的个数a[i].count
//以s=30为例观察它当中质因子2的变化情况
// 0秒 1个
// 1秒 30个 30=2*3*5
// 2秒 30*30个 30*30=2*3*5*2*3*5
// 3秒 30*30*30个 30*30*30= 2*3*5*2*3*5*2*3*5
// 看出来了吧每秒都是原来的30倍个但因子2的增加可是1个1个增加的。
// 为什么是1个呢因为30原来的质数因子就只有1个2如果有2个2就是2个2个增加的。
// 总结一下以30为例因为只有1个2这个质数因子那么如果需要3个2就需要分裂3秒
// 如果需要a[i].count这么多个质数因子就要找出原配带来cnt个的经过几秒才能等于或超过。
// C++的整数除法上取整~
int second = (a[i].count - 1) / cnt + 1;
//找出s中幂指数最大的
Max = max(Max, second);
}
Min = min(Min, Max);//最少秒时可以装进试管
}
}
if (Min == INF) printf("-1");//如果没有改变,输出-1
else printf("%d", Min);//输出结果
return 0;
}