CF1708B题解

由最大公因数,$\gcd(i,a_i) \leq i$,即 $\gcd(1, a_1) = 1$,

而 $\gcd(2, a_2) \leq 2$,所以 $\gcd (2, a_2) = 2$,(因为 $1 = \gcd(1, a_1) \ne \gcd (2, a_2)$)。

即可推出:$\gcd (i, a_i) = i$,即 $i \mid a_i$,

所以只需在区间 $[L, R]$ 中找到第一个整除 $i$ 的数即可。

#include <map>
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;

const int N = 1e5 + 10;

int a[N];
map <int, bool> mp;

int main() {
    int T; scanf ("%d", &T);
    while (T--) {
        int n, l, r; scanf ("%d%d%d", &n, &l, &r);
        bool flag = false;
        for (int i = 1; i <= n; ++i) {
            long long use = ceil (1.0 * l / i) * i;
            if (use > r) {
                flag = true; break;
            }
            a[i] = use;
        }
        if (!flag) {
            printf ("YES\n");
            for (int i = 1; i <= n; ++i) {
                printf ("%d ", a[i]);
            }
            printf("\n");
        } else printf("NO\n");
    }
    return 0;
}

考场上的我考虑成 $a_i$ 互不相同,挂了好 2 次。

posted @ 2022-07-18 09:42  wangzhongyuan  阅读(12)  评论(0)    收藏  举报  来源