for i inrange(len(s) - 2): if s[i] == 'A': for j inrange(i + 1, len(s) - 1, 1): if s[j] == 'B': for k inrange(j + 1, len(s), 1): if s[k] == 'C'and k - j == j - i: res += 1
int n, k, a[N], cnt[N], s[N], maxx = 0; voidsolve(){ cin >> n >> k; for (int i = 1; i <= n; i++) cin >> a[i], s[a[i]]++, maxx = max(maxx, a[i]); // 初始化 t 数组 for (int i = 1; i <= maxx; i++) { int t = i; while (t <= maxx) cnt[i] += s[t], t += i; }
for (int i = 1; i <= n; i++) for (int j = a[i]; j >= 1; j--) if (a[i] % j == 0 && cnt[j] >= k) { cout << j << endl; break; } }
int n, k, a[N], cnt[N], s[N], res[N], maxx = 0; voidsolve(){ cin >> n >> k; for (int i = 1; i <= n; i++) cin >> a[i], s[a[i]]++, maxx = max(maxx, a[i]); // 初始化 t 数组 for (int i = 1; i <= maxx; i++) { int t = i; while (t <= maxx) cnt[i] += s[t], t += i; }
for (int i = maxx; i >= 1; i--) if (cnt[i] >= k) for (int j = i; j <= maxx; j += i) if (!res[j]) res[j] = i;
for (int i = 1; i <= n; i++) cout << res[a[i]] << endl; }
我们不妨遍历每个 GCD,如果当前这个数 ≥k 的话,那么代表它能做被选出来的那个数,则从 i 开始往最大的数找,如果当前数没有找到过更大的 GCD 过,则我们当前遍历到的数就是最优的,每次递增的时候是 j += i ,因为首先要满足 ai 能整除 GCD 这个条件