給定一組互不相同的大整數 N₁, N₂, …, Nₓ 與上限 M,尋找不超過 M 的整數 P,使所有 Nᵢ mod P 互不相同;並進一步找出符合條件的最小 P。此為數論與組合優化問題,可轉化為「差值集合不被 P 整除」的等價條件。
Nᵢ mod P = Nⱼ mod P ⇔ P | (Nᵢ - Nⱼ)。
因此 P 不能整除任意兩數之差 |Nᵢ - Nⱼ|。令差值集合 D = { |Nᵢ - Nⱼ| : i < j },問題轉為:
找最小
P ≤ M,使∀ d ∈ D, d mod P ≠ 0。
int findMinP(List<Long> nums, int M) {
Set<Long> diffs = new HashSet<>();
for (int i = 0; i < nums.size(); i++)
for (int j = i + 1; j < nums.size(); j++)
diffs.add(Math.abs(nums.get(i) - nums.get(j)));
for (int p = 2; p <= M; p++) {
boolean ok = true;
for (long d : diffs) {
if (d % p == 0) { ok = false; break; }
}
if (ok) return p;
}
return -1; // 無解
}
時間複雜度 O(x² + M·|D|),M 較大時不可行。
若取 P > max(N),則所有模數即為原數,必唯一。但受限 P ≤ M,可嘗試:
max(N) 向下嘗試,或P = floor(max(N)/k) + 1 形式搜尋,因大數除以較小 P 餘數分布較均勻。M 極大(如 10⁹),需結合數論性質(如中國剩餘定理、模算術)設計亞線性演算法。此問題本質為「避開差值集合的因數」,理解數學本質後可根據資料規模選擇枚舉、篩選或啟發式搜尋。