1. 程式人生 > 其它 >C. Hossam and Trainees_分解質因數

C. Hossam and Trainees_分解質因數

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() ;
	
}