Solution -「CF 1622F」Quadratic Set
Link.
求 ,使得 是完全平方数,并最大化 。
。
爆搜打出 以内的表,发现 。先研究偶数 :
那么若 是完全平方数,有 ;否则若 是完全平方数,有 ,删去 即可;否则至少有 ,只需要删去 和 。继而,对于奇数 ,答案至少为 。
所以,我们只需要判断 能否取 。这里有个 trick:异或哈希。对于每个素数 ,独立随机生成 hash 值 ,并定义 ,这样就能对每个数建立 hash,若两数 的唯一分解中指数奇偶性完全一致,就应有 。利用这个 trick,求出所有 后顶多拿 unordered map 判一判就能完成 的取值判断了。复杂度为 (假定 std::unordered_map
为 操作)。
/*+Rainybunny+*/
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i)
typedef unsigned long long ULL;
const int MAXN = 1e6;
int n, pn, pr[MAXN + 5];
bool npr[MAXN + 5];
ULL hnum[MAXN + 5], hfac[MAXN + 5];
std::unordered_map<ULL, int> buc;
inline void init() {
std::mt19937_64 emt(time(0) ^ 20120712);
rep (i, 2, n) {
if (!npr[i]) hnum[pr[++pn] = i] = emt();
for (int j = 1, t; j <= pn && (t = i * pr[j]) <= n; ++j) {
npr[t] = true, hnum[t] = hnum[i] ^ hnum[pr[j]];
if (!(i % pr[j])) break;
}
}
rep (i, 1, n) hfac[i] = hfac[i - 1] ^ hnum[i];
}
int main() {
scanf("%d", &n), init();
ULL h = 0;
rep (i, 1, n) h ^= hfac[i];
if (!h) {
printf("%d\n", n);
rep (i, 1, n) printf("%d%c", i, i < n ? ' ' : '\n');
return 0;
}
rep (i, 1, n) if (h == hfac[i]) {
printf("%d\n", n - 1);
rep (j, 1, n) if (i != j) printf("%d ", j);
return putchar('\n'), 0;
}
rep (i, 1, n) buc[hfac[i]] = i;
rep (i, 1, n) if (buc.count(h ^ hfac[i])) {
printf("%d\n", n - 2); int tmp = buc[h ^ hfac[i]];
rep (j, 1, n) if (j != i && j != tmp) printf("%d ", j);
return putchar('\n'), 0;
}
printf("%d\n", n - 3);
rep (i, 1, n - 1) if (i != 2 && i != n >> 1) printf("%d ", i);
return putchar('\n'), 0;
}
分类:
B.思想/技巧 / Tricks
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-01-15 Solution -「AGC 034C」Tests