专栏文章

P13896 题解

P13896题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mio1fa11
此快照首次捕获于
2025/12/02 11:47
3 个月前
此快照最后确认于
2025/12/02 11:47
3 个月前
查看原文
显然不能枚举。
考虑质因数分解,丢到 vector 中。
priipri_i 表示能被 ii 整除的数的下标。
CPP
r(n)
{
	int x = a[i];
	for (int p = 2; p * p <= x; p++)
	{
		if (x % p == 0)
			pri[p].push_back(i);
		while (x % p == 0) x /= p;
		if (x == 1) break;
	}
	if (x != 1) pri[x].push_back(i);
}
不难发现这样做之后 vector 中的数都是排好序的。
然后在做一遍,在 vector 中查询每个质因数的第二小下标即可。
为什么是第二小?
因为 ii 一定只会是一个质因数的第一小下标,jj 一定只会是一个质因数的第二小下标。
ii 就是现在枚举的,我们要求 jj,所以就是第二小。
CPP
r(n)
{
	int x = a[i], mn = N;
	for (int p = 2; p * p <= x; p++)
	{
		if (x % p == 0 && pri[p].size() > 1)
			mn = min(mn, pri[p][1]);
		while (x % p == 0) x /= p;
		if (x == 1) break;
	}
	if (x != 1 && pri[x].size() > 1)
		mn = min(mn, pri[x][1]); //vector 下标从 0 开始,所以第二小就是 pri[x][1]
	if (mn != N) 
		return cout << i << " " << mn, 0;
}
注意 jj 是所有 prip,1pri_{p, 1}min\min。并不是找到了直接输出就行。
hack 可以参考楼上大佬的:
CPP
5
6 15 10 3 5

评论

1 条评论,欢迎与作者交流。

正在加载评论...