CF1025B Weakened Common Divisor 題解
阿新 • • 發佈:2021-12-16
CF1025B Weakened Common Divisor 題解
Content
定義 \(n\) 個數對 \((a_1,b_1),(a_2,b_2),(a_3,b_3),...,(a_n,b_n)\) 的 \(\text{WCD}\) 為能夠整除每個數對中至少一個數的 \(>1\) 的整數。現在,給出 \(n\) 個數對,請找出它們的 \(\text{WCD}\),或者這 \(n\) 個數對沒有符合要求的 \(\text{WCD}\)。
資料範圍:\(1\leqslant n\leqslant 1.5\times 10^5,2\leqslant a_i,b_i\leqslant 2\times 10^9\)。
Solution
我們先把第一個數對的質因子分解出來,然後再在後面找是否有不能夠滿足條件的質因子,有的話就刪除,否則就保留著。最後看是否還有剩下的質因子即可。
Code
int n, pr[150007]; int main() { n = Rint; F(i, 1, n) { int x = Rint, y = Rint; if(i == 1) { F(j, 2, sqrt(x)) if(!(x % j)) {pr[++pr[0]] = j; while(!(x % j)) x /= j;} if(x != 1) pr[++pr[0]] = x; F(j, 2, sqrt(y)) if(!(y % j)) {pr[++pr[0]] = j; while(!(y % j)) y /= j;} if(y != 1) pr[++pr[0]] = y; } else F(j, 1, pr[0]) if(!pr[j]) continue; else if(x % pr[j] && y % pr[j]) pr[j] = 0; } F(i, 1, pr[0]) if(pr[i]) return printf("%d", pr[i]), 0; printf("-1"); return 0; }