題目大意:給定 N (≤ 10⁹),求最小 M 使 N/M 為素數。不存在輸出 0。多測試用例(≤1000),大數(>10⁶)≤100 組。
N/M = p (素數) → M = N/p。M 最小 ⇔ p 最大 ⇔ p 為 N 的最大素因子。
p*p > n 則跳過(優化)。n % p == 0,循環除盡 n/=p,更新 max_prime = max(max_prime, p)。n > 1 剩餘大素因子,max_prime = max(max_prime, n)。M = 原始N / max_prime。
void sieve() {
for (int i=2; i=0; --i) {
int p=primes[i];
if ((long long)p*p > n) continue;
if (n%p==0) { while (n%p==0) n/=p; maxp=max(maxp,p); }
}
maxp = max(maxp, n);
printf("%d\n", tmp/maxp);
}
篩法 O(MAXP log log MAXP) ≈ 10⁵。單查詢 O(π(√N)) ≈ 3400 除法。1000 組極快。
與 HDU 5108 同題(ID 206608 重複)。核心技巧:逆向思維將最小 M 轉為最大素因子,結合預篩素數表試除。注意剩餘大素因子處理與 N=1 邊界。代碼簡短高效,屬數論基礎模板題。