C. Hossam and Trainees_分解質因數
阿新 • • 發佈:2022-12-12
C. Hossam and Trainees
太久沒登部落格園了密碼都忘記了...
題目大意
給n個數,問能不能找到一個x使得x整除其中的任意兩個數。
思路
這題的解法很快就想出來了,就是直接每個數字拆分質因子。我們可以通過篩法將sqrt(1e9)內的所有質數預處理出來即可。
賽時沒做出來是因為這題卡了unordered_map,只能說血虧
ll prm[N] , cnt ; ll st[N] ; ll m ; void euler(ll n){ m = sqrt(n) + 10 ;// cout << m << "\n" ; for(ll i = 2 ; i <= m ; i ++ ){ // cout << i << "<\n" ; if(!st[i]){ prm[ ++ cnt] = i ; } for(ll j = 1 ; j <= cnt && prm[j]*i <= m ; j ++ ){ st[prm[j]*i] = 1 ; if(i % prm[j] == 0) break ; } } } string solve(){ ll n ; cin >> n ; vct<ll> a(n + 1 , 0) ; rep(i , 1 , n) cin >> a[i] ; map<ll , int> vs ; rep(i , 1 , n){ ll tmp = a[i] ; for(int j = 1 ; j <= cnt && prm[j] <= tmp ; j ++ ){ if(a[i] % prm[j] == 0){//cout << prm[j] << " " ; if( ++ vs[prm[j]] == 2) return "YES\n" ; while(a[i] % prm[j] == 0) a[i] /= prm[j] ; } } if(a[i] > 1) if( ++ vs[a[i]] == 2) return "YES\n" ; } return "NO\n" ; }//code_by_tyrii int main(){ euler(1e9 + 10) ; // freopen("in.in" , "r" , stdin) ; // freopen("out.out" , "w" , stdout) ; ios::sync_with_stdio(false) ; cin.tie(0) ; cout.tie(0) ; ll T ; cin >> T ; while(T -- ) cout << solve() ; }