CF1649D 题解
__vector__ · · 个人记录
题目大意:
给定
给定一个长度为
数组中拿出任意两个数
问
题目分析:
可以发现,题目限定了每个数组元素
枚举
那么如何判断某个数值范围内是否有数出现在
for(int i=1;i<=n;i++)
{
a[i]=read();
hash[a[i]]++;
}
然后定义一个数组
AC 代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
namespace Main
{
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int hash[maxn];
int qzh[maxn];
int a[maxn];
bool vis[maxn];
int t;
int n,c;
void main()
{
t=read();
while(t--)
{
n=read();
c=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
hash[a[i]]++;
vis[a[i]]=1;
}
for(int i=1;i<=c;i++)
{
qzh[i]=qzh[i-1]+hash[i];
}//方便确定某一个范围内的数的数量
bool flag=1;
for(int i=2;i<=c;i++)
{
if(!vis[i])continue;
for(int j=1;i*j<=c;j++)
{//枚举因数,跟线性筛有些像
int l=i*j;
int r=i*j+i-1;
r=min(r,c);
if((qzh[r]-qzh[l-1])&&!vis[j])
{
flag=0;
}
}
}
if(!flag)
{
printf("No\n");
}
else
{
printf("Yes\n");
}
for(int i=1;i<=n;i++)
{
hash[a[i]]--;
vis[a[i]]=0;
}
}
}
}
int main()
{
Main::main();
#ifndef ONLINE_JUDGE
system("pause");
#endif
return 0;
}