CF1603A Di-visible Confusion

题目大意

给一个长度为 nn 的序列 aa,对于每个位置 ii,如果 aimod(i+1)0a_i \bmod (i+1)\ne0,就可以将 aia_i 删掉。

删掉之后,后面的数都会往前面移动一位。

问能否将序列删成空。

对于 100%100\% 的数据,1t104,1n105,1n3×105,1ai1091≤t≤10^4,1≤n≤10^5,1≤\sum n≤3×10^5,1≤a_i≤10^9

解题思路

首先可以知道,通过删除操作,任何一个数向前移动而不能向后。

那么如果这个序列中有至少一个 aia_i 满足 1ji,aimodj=0\forall 1 \leq j \leq i,a_i \bmod j=0,那么一定无解。

根据数论知识

如果一个数 xx 被一个集合 aa 的数的 Lcm整除,那么 xx 整除这个集合内的所有数。

那么循环判断时,可以顺便维护一下 Lcm

时间复杂度 O(tn)\mathcal O(tn)

反之一定有解。

CODE

#include <bits/stdc++.h>

using namespace std;

long long T, n, a[100005];

long long gcd(long long a, long long b)
{
	if (b == 0)
		return a;
	return gcd(b, a % b);
}

signed main()
{
	scanf("%lld", &T);
	while (T--)
	{
		scanf("%lld", &n);
		for (long long i = 1; i <= n; i++)
			scanf("%lld", &a[i]);
		long long now = 1, flag = 1;
		for (long long i = 1; i <= n; i++)
		{
			now = now / gcd(now, i + 1) * (i + 1);
			if (a[i] % now == 0)
			{
				printf("NO\n");
				flag = 0;
				break;
			}
		}
		if (flag)
			printf("YES\n");
	}
	return 0;
}
posted @ 2021-11-12 18:08  蒟蒻orz  阅读(4)  评论(0编辑  收藏  举报  来源