# ZeroJudge - d775: NOIP2009 3.細胞分裂
### 題目連結:https://zerojudge.tw/ShowProblem?problemid=d775
###### tags: `ZeroJudge` `數學` `質數`
```cpp=
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define SIZE 35000
int primes[SIZE], primeAmount, base, power, baseFactors[10], factorPowers[10], factors;
bool notPrime[SIZE] = { true, true };
void Initialize() {
for (int i = 2; i < SIZE; ++i) {
if (!notPrime[i])
primes[primeAmount] = i, ++primeAmount;
for (int j = 0; i * primes[j] < SIZE; ++j) {
notPrime[i * primes[j]] = true;
if (!(i % primes[j]))
break;
}
}
}
void AnalyzeBase() {
int buffer = sqrt(base);
for (int i = 0; primes[i] <= buffer; ++i) {
if (!(base % primes[i])) {
do {
++factorPowers[factors]; base /= primes[i];
} while (!(base % primes[i]));
factorPowers[factors] *= power;
baseFactors[factors] = primes[i]; ++factors;
}
}
if (base != 1) {
factorPowers[factors] = power;
baseFactors[factors] = base; ++factors;
}
}
int main() {
cin.sync_with_stdio(false), cin.tie(nullptr);
int kinds, reproduce, minimumTime = (1 << 30), cellTime;
bool have = false, valid;
Initialize();
cin >> kinds >> base >> power;
if (base == 1) {
while (kinds--)
cin >> reproduce;
cout << "0\n";
}
else {
AnalyzeBase();
while (kinds--) {
cin >> reproduce; valid = true; cellTime = 0;
for (int i = 0, power = 0; i < factors; ++i, power = 0) {
if (reproduce % baseFactors[i]) {
valid = false;
break;
}
do {
++power; reproduce /= baseFactors[i];
} while (!(reproduce % baseFactors[i]));
cellTime = max(cellTime, int(ceil(1.0 * factorPowers[i] / power)));
}
if (valid) {
minimumTime = min(minimumTime, cellTime);
have = true;
}
}
if (!have)
cout << "-1\n";
else
cout << minimumTime << '\n';
}
}
```