給大整數 K(最多 100 位)和整數 L(≤ 10⁶)。K 是兩個素數乘積。判斷較小素因子是否 < L。若是輸出 BAD p(p 為較小因子),否則 GOOD。
rem = (rem * 10 + digit) % pBAD p,結束GOOD按 10⁴(萬進制)分塊,減少循環次數:
bool divisible(const string& K, int p) {
long long rem = 0;
for (char c : K) {
rem = (rem * 10 + (c - '0')) % p;
}
return rem == 0;
}
// 萬進制版(需防溢出:rem < p ≤ 10⁶,rem*10000 < 10¹⁰,64位安全)
bool divisible_fast(const string& K, int p) {
long long rem = 0;
int len = K.length();
for (int i = 0; i < len; i += 4) {
int block = 0;
for (int j = i; j < min(i+4, len); ++j)
block = block * 10 + (K[j] - '0');
rem = (rem * 10000 + block) % p;
}
return rem == 0;
}
#includeusing namespace std; const int MAXL = 1000000; vector primes; bool is_composite[MAXL + 1]; void sieve() { for (int i = 2; i <= MAXL; ++i) { if (!is_composite[i]) primes.push_back(i); for (int p : primes) { if (i * p > MAXL) break; is_composite[i * p] = true; if (i % p == 0) break; } } } bool check(const string& K, int p) { long long rem = 0; for (char c : K) rem = (rem * 10 + c - '0') % p; return rem == 0; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); sieve(); string K; int L; while (cin >> K >> L) { if (K == "0" && L == 0) break; bool found = false; for (int p : primes) { if (p >= L) break; if (check(K, p)) { cout << "BAD " << p << '\n'; found = true; break; } } if (!found) cout << "GOOD\n"; } return 0; }
stoll 轉數值再取模,更快