CF1777C Quiz Master题解
题目简述
给定一个长度为
求所有满足条件的序列
思路
考虑先排序。
将序列排序之后,如果区间
所以可以考虑双指针,每次将右端点向右移一位。考虑删去左端点,若可以整除的数没有减少,则删去左端点。
代码
#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
const int N = 1E5 + 5;
int t, n, m;
int a[N];
int b[N];
int main()
{
cin >> t;
while (t--) {
memset(b, 0, sizeof(b));
cin >> n >> m;
for (int i = 1; i <= n ;i++) cin >> a[i];
sort (a + 1, a + n + 1);
int l = 1, ans = 0x3F3F3F3F, now = 0;
for (int r = 1; r <= n; r++) {
for (int i = 1; i * i <= a[r]; i++) {
if (a[r] % i == 0) {
if (!b[i] && i <= m) now++;
if (i * i != a[r] && !b[a[r] / i] && a[r] / i <= m) now++;
b[i]++;
if (i * i != a[r]) b[a[r] / i]++;
}
}
while (l < r) {
bool ok = 1;
for (int i = 1; i * i <= a[l]; i++) {
if (a[l] % i == 0) {
if (b[i] == 1 && i <= m || b[a[l] / i] == 1 && a[l] / i <= m ) {
ok = 0;
break;
}
}
}
if (!ok) break;
for (int i = 1; i * i <= a[l]; i++) {
if (a[l] % i == 0) {
b[i]--;
if (i * i != a[l]) b[a[l] / i]--;
}
}
l++;
}
if (now == m) ans = min(a[r] - a[l], ans);
}
if (ans == 0x3F3F3F3F) cout << -1;
else cout << ans;
cout << '\n';
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】