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 次。
浙公网安备 33010602011771号