专栏文章

P4411 [BJWC2010] 取数游戏 题解

P4411题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mincmg7p
此快照首次捕获于
2025/12/02 00:13
3 个月前
此快照最后确认于
2025/12/02 00:13
3 个月前
查看原文
博客园 可能食用更佳。
给定 nn 个数 a1,2,,na_{1,2,\dots,n},你需要从左到右按顺序取出一些数,第一个数任取,钦定目前取的数为 aja_j,下一个取的数为 aka_k,需满足 gcd(aj,ak)L\gcd(a_j,a_k) \geq L,求最大化取出数的数量。
钦定 VVaia_i 的最大值,记 fjf_j 表示约数为 jj 时最大的答案数量,每次 O(ai)\mathcal O(\sqrt a_i) 枚举 aia_i 的约数,将 L\geq L 的数取出来更新答案即可,最终答案即为 maxj=LVfj\max_{j=L}^{V} f_j,时间复杂度为 O(nV)\mathcal O(n \sqrt V),空间复杂度为 O(V)\mathcal O(V)
CPP
const int N=5e4+5,M=1e6+5;
int n,lim,f[M];
vector<int> a[N];
int main()
{
	read(n),read(lim);
	for(int i=1;i<=n;i++)
	{
		int x; read(x);
		for(int j=1;j*j<=x;j++)
			if(x%j==0)
			{
				if(j>=lim) a[i].pb(j);
				if(j*j!=x&&x/j>=lim) a[i].pb(x/j);
			}
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		int res=0;
		for(auto x:a[i]) chkmax(res,f[x]+1);
		chkmax(ans,res);
		for(auto x:a[i]) f[x]=res;
	}
	write(ans);
	return 0;
}

评论

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

正在加载评论...