CF1771C

Idea

注意到取值范围不大,因此可以打出质数的表, 然后筛选用map存起来进行判断。

注意到数据范围只有1e9, 由于因数的对偶性, 只要打出\(\sqrt{1e9}\)的表就行了, 经过计算, 是3403个.

然后对于每个试一遍如果可以的话就标记一下, 如果发现一样的就继续说明可以了, 然后退出.

Code

#include<bits/stdc++.h>
#define F(i, a, b) for(int i=a; i<=b; i++)
#define Fd(i, b, a) for(int i=b; i>=a; i--)
#define MAXN 100500
#define N 3403
using namespace std;
int ans;
int a[3404]={前3404项质数};
int b[MAXN];
map<int, int> mp;
void solve(){
	bool flag = 1;
	int n; cin>>n; mp.clear();
	F(i, 1, n) cin>>b[i];
	F(j, 1, n){
		int x = b[j];
		F(i, 0, N){
			if(a[i]>x) break;
			if(x%a[i]==0){
				if(mp[a[i]]!=0){
					flag=0;break;
				}else{
					while(x%a[i]==0) x /= a[i];
					mp[a[i]]++;
				}
			}
		}
		b[j]=x;
	}
	F(i, 1, n){
		if(mp[b[i]]!= 0){
			if(b[i]!=1){
				flag=0; break;
			}else{
				mp[b[i]]++;
				continue;
			}
		}else{
			mp[b[i]]++;
		}
	}
	if(flag) cout<<"No\n";
	else cout<<"Yes\n";
}
int main(){
	int T; cin>>T;while(T--) solve();
}
posted @ 2022-12-12 01:47  Micoael_Primo  阅读(22)  评论(0)    收藏  举报