我的思路
读入 m1, 将它的所有因子分解至 m1_factors[] 数组中
依次读入n个 Si
对于每一种 Si, 首先将它的所有因子分解至si_factors[]数组中
然后遍历 m1_factors[]中的所有因子, 判断 Si是否也有这个因子, 如果没有, 则当前Si无解
如果Si包含了m1的所有因子, 则找到它们所有的共同因子, 将m1的因子的幂次减去Si的因子的幂次即为当前Si 的解
找到所有Si的解的最小值, 作为答案
#include<stdio.h>
int n; //一共n种细胞
int m1, m2; //试管总数(m1^m2)
int Si; //细胞数量
int ans = 2000000005; //最短时间
typedef struct factor{
int factor; //因子
int cnt; //这个因子出现的次数(幂次)
}factor;
factor m1_factors[10010]; //储存m1的所有因子和因子出现次数
factor si_factors[10010]; //储存Si的所有因子和因子出现次数(幂次)
int Decomposition(int x, factor arr[]){ //将x的每个因子的值和出现次数记录在arr[]中
int idx = 0;
for (int i = 2; i * i <= x; i++){
if (x % i == 0) arr[++idx].factor = i, arr[idx].cnt = 0; //记录因子
while(x % i == 0){
arr[idx].cnt++; //记录因子的幂次
x /= i;
}
}
if (x > 1){ //如果没有分解完, 则剩下的数也是一个因子
arr[++idx].factor = x;
arr[idx].cnt = 1;
}
return idx; //返回因子数
}
int max(int a, int b){ //取最大值
if(a > b) return a;
return b;
}
int min(int a, int b){ //取最小值
if(a < b) return a;
return b;
}
int main(){
scanf("%d %d %d", &n, &m1, &m2);
int m1_cnt = Decomposition(m1, m1_factors); //分解m1
while (n--){
scanf("%d", &Si); //读入当前细胞的数量
int si_cnt = Decomposition(Si, si_factors); //分解Si
int x = 0; //细胞的分裂时间
for (int i = 1; i <= m1_cnt; i++){ //枚举m1的所有因子
if (Si % m1_factors[i].factor != 0){ //m1中有Si没有的因子, 则无解
x = -1; //无解
break;
}
}
if (x != -1){ //如果有解, 则计算x的值
int idx2 = 1;
for (int idx1 = 1; idx1 <= m1_cnt; idx1++){
//找到Si中与m1中相同的因子
while(si_factors[idx2].factor != m1_factors[idx1].factor) idx2++;
//m1中因子的幂次 - Si中因子的幂次 即为x的取值
x = max(x, m1_factors[idx1].cnt - si_factors[idx2].cnt + 1);
}
}
if (x >= 0) ans = min(ans, x); //记录答案的最小值
}
if (ans >= 200000000) puts("-1");
else printf("%d\n", ans);
return 0;
}
但是只拿了40分, 因此请求各位大佬指出问题