給定大整數 K(≤ 10^100)和下界 L(≤ 10^6)。K 是兩個質數的乘積。若 K 存在質因數 p < L,輸出 "BAD p"(p 為最小質因數);否則輸出 "GOOD"。
rem = (rem*10 + digit) % p。#include <cstdio>
#include <cstring>
using namespace std;
const int MAXL = 1000000;
int isComp[MAXL+1];
int primes[MAXL/10];
int pcnt = 0;
void sieve() {
for (int i = 2; i <= MAXL; i++) {
if (!isComp[i]) primes[pcnt++] = i;
for (int j = 0; j < pcnt && i*primes[j] <= MAXL; j++) {
isComp[i*primes[j]] = 1;
if (i % primes[j] == 0) break;
}
}
}
int main() {
sieve();
char K[110];
int L;
while (scanf("%s%d", K, &L) == 2) {
if (strcmp(K, "0") == 0 && L == 0) break;
int len = strlen(K);
int ans = -1;
for (int i = 0; i < pcnt; i++) {
int p = primes[i];
if (p >= L) break;
int rem = 0;
for (int j = 0; j < len; j++)
rem = (rem * 10 + (K[j]-'0')) % p;
if (rem == 0) {
ans = p;
break;
}
}
if (ans == -1) puts("GOOD");
else printf("BAD %d\n", ans);
}
return 0;
}
本題核心是大整數取模與質數篩的結合。利用「K 只有兩個質因數」的性質,只要找到一個 < L 的質因數即可判定 BAD。線性篩預處理質數表,配合字符串模擬取模,代碼簡潔高效。