Codeforces Round #767 (Div. 2)——B. GCD Arrays

2022-12-19,,,

B. GCD Arrays

题源:https://codeforces.com/contest/1629/problem/B

题目大意

给出一段区间[l, r],可以进行操作(把任意两个数拿出来,把他俩乘积放回去),如果经过 k 次该操作后,能找到两个数a, b, 使得 gcd(a, b) > 1,就输出"YES",否则输出"NO"

思路

    如果要使得整个数组的GCD大于 1,每个元素都必须具有一个共同的质因数,因而很容易得出 2 是最常见的质因数
    又因为偶数一定有 2 这个因子,因此我们只需要对奇数进行操作即可
    所以要做的就是统计出[l, r]内有多少个奇数,而这有个公式(是我没学过的)要记下来

    统计一段区间内的奇数个数: \((r−l+1)−(r/2−(l−1)/2)\)

    4.奇数的个数cnt大于 k 的话就没法实现啦

我滴代码

#include <iostream>
#include <algorithm>
#include <cmath> using namespace std;
int t; int main (){
cin >> t;
while (t --){
int l, r, k;
cin >> l >> r >> k;
if (l == r){
if (l == 1)
cout << "NO" << endl;
else
cout << "YES" << endl;
continue;
} int cnt = (r - l + 1) - (r / 2 - (l - 1) / 2);//长知识
if (cnt <= k)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}

博客园的第一篇博客(●'◡'●)

Codeforces Round #767 (Div. 2)——B. GCD Arrays的相关教程结束。

《Codeforces Round #767 (Div. 2)——B. GCD Arrays.doc》

下载本文的Word格式文档,以方便收藏与打印。