CF1603A Di-visible Confusion
题目大意
给一个长度为 的序列 ,对于每个位置 ,如果 ,就可以将 删掉。
删掉之后,后面的数都会往前面移动一位。
问能否将序列删成空。
对于 的数据,。
解题思路
首先可以知道,通过删除操作,任何一个数向前移动而不能向后。
那么如果这个序列中有至少一个 满足 ,那么一定无解。
根据数论知识
如果一个数 被一个集合 的数的
Lcm
整除,那么 整除这个集合内的所有数。
那么循环判断时,可以顺便维护一下 Lcm
。
时间复杂度 。
反之一定有解。
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;
}
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122095