今天的每日一题也挺好的,也是我不会的,增加了知识hhh
首先看这个稍微简单一些的D题
解题思路:
- 这题一开始想复杂了,忘记了1可以随便切换
- 所以任何都可以和1进行切换,慢慢换肯定能换完
- 所以都是Yes
然后看一下升级版的E题
解题思路:
- 这个题只能相邻之间的进行切换,当然还是不用管1,1和任何数gcd都是1,所以可以随便切换
- 然后我们想如果前面有个数,比现在这个数大,而且他们的gcd不是1,那么肯定是不行的,如果暴力写的话肯定会超时的,这里也是关键点
- 我们可以将当前的数的因数赋值,值就为当前这个数,这样我们下次在走到这个位置上的数如果比这个数字小,那么肯定不符合(相当于 6 3 这种情况),如果他们的因数相同,但是因数的位置的值比当前这个大,那么也不符合(相当于9 6 这种情况)
- 所以我们判断出这种情况即可
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 100010;
int ans[N];
int main(){
int n;
scanf("%d",&n);
for (int i = 1; i <= n ; i++){
int x;
scanf("%d",&x);
if (ans[x] > x){ // 第一种情况,当前值就是之前值的因数
puts("No");
return 0;
}
ans[x] = x;
for (int j = 2; j <= sqrt(x); j ++){
if (x % j == 0){
int a = j, b = x / j;
if (ans[a] > x || ans[b] > x){ // 第二种情况,他们的因数相同,但是之前有数比他大
puts("No");
return 0;
}
ans[a] = ans[b] = x;
}
}
}
puts("Yes");
return 0;
}