Koasar and PGCD#12431

Koasar and PGCD (Розбір)

Автор задачі:

Al Koasar Hussain (Al_Kaosar)

Підготував:

Mohammad Nasser (MOAGEZA)

Редактор:

Hasan Saleh (MathModel)

Розв'язання

Загальна ідея: Потрібно з'ясувати, чи існує додатне ціле число таке, що \gcd(a_i, a_j) = g для всіх пар в арифметичній послідовності.

Спочатку перевіримо, чи ділиться на . Якщо ні, це неможливо.

Якщо a = g, то відповідь завжди "YES", оскільки ми можемо вибрати будь-яке , кратне .

Інакше нехай x = a / g. Ключове спостереження таке:

  • Якщо має простий дільник і m > p, то ми не зможемо уникнути появи пар із \gcd > g.

  • Якщо m \le p, де — найменший простий дільник числа , ми можемо вибрати d = g, і умова виконуватиметься.

Отже, потрібно знайти найменший простий дільник числа і перевірити, чи не перевищує це значення.

Розв'язок працює за \mathcal{O}(\sqrt{x}) на один набір вхідних даних.

#include <bits/stdc++.h>
using namespace std;

int smallest_prime_factor(int x) {
    for (long long i = 2; i * i <= x; i++) {
        if (x % i == 0) return i;
    }
    return x;
}

void solve(){
    int a, g, m;
    cin >> a >> g >> m;
    if(m==1){
        cout<<"YES";
        return;
    }    
    if (a % g != 0) {
        cout << "NO";
        return;
    }
    
    int x = a / g;
    if (x == 1) {
        cout << "YES";
        return;
    }
    
    int p = smallest_prime_factor(x);
    if (m <= p) cout << "YES";
    else cout << "NO";
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin >> t;
    while (t--) {
        solve();
        cout << '\n';
    }
    return 0;
}