正经题解|寻找排列
2024-04-08 11:08:08
发布于:浙江
66阅读
0回复
0点赞
题目分析
对于一对数来说,如果他们含有共同的因子,且大于1,则不互质。
用一个map
来记录出现过的因子,由于并不是所有的因子都需要被记录,比如一个数有因子 ,那么这个数也有 的因子 ,如 有因子 ,存在因子 必然用时存在 的因子 ,存在因子 ,必然同时存在 的因子 。
其中 不需要被记录,因为我们可以找到更小的因子 ,显然只需要记录所有的质因子
即可。我们可以用埃氏筛
先记录所有 质数
,再对每个数进行因子的统计。
这里可以分成两种情况。数,直接记录。数,要除尽所有的质因子
,剩下的数如果 ,则说明这个数存在一个 的质因子
,也需要被记录。
最终如果质因子
出现的次数大于 ,则说明出现了不互质的数。
AC代码
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const ll A = 1e9;
int t,n;
bitset<31666> p;
vector<int> v;
void init() {
int r = sqrt(A);
for(int i=2;i<=r;i++) {
if (p[i]) {
continue;
}
v.push_back(i);
for(int j=2*i;j<=r;j+=i) {
p[j] = true;
}
}
}
int main() {
init();
ios::sync_with_stdio(false);
cin >> t;
while(t--) {
cin >> n;
unordered_map<int,int> vis;
int flag = 0;
for(int i=0;i<n;i++) {
int a;
cin >> a;
if (!flag) {
for(int &j:v) {
if (a % j == 0) {
vis[j]++;
if (vis[j] > 1) {
flag = 1;
}
while(a % j == 0)a /= j;
}
}
if (a != 1)vis[a]++;
if (vis[a] > 1) {
flag = 1;
}
}
}
if (flag)cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
复杂度
全部评论 1
老师,我服了,我写了半天的代码才AC,结果一个人拿着暴力gcd的代码直接就AC了,用时只用了53ms,服了
2024-04-08 来自 广东
0AC并不是唯一的目标,理解和学习新的解决方法同样重要。暴力求解可能在某些情况下会奏效,但在面对更大规模的问题或者更高效的算法时,它就不再适用了。
2024-04-08 来自 浙江
1所以数据要符合一点吧。
2024-04-08 来自 广东
0那个拿gcdAC的人是我……(逃)
2024-04-09 来自 浙江
0
有帮助,赞一个