原题题意转换为,对每个询问x,查询序列中是否存在两个整数a,b,使得a/b=x(特别地,当只有一个齿轮时,x可以为1)
可以直接对所有结果为"YES"的x进行预处理。首先若b可被a整除,那么必有a<=b,且a是b的约数。将原序列排序后,从左到右分解约数x,然后查询这个约数是否在原序列中存在过。若是,那么标记x,查询到它时输出“YES”。
参考代码:(比赛时的源码,赛后AC)
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int ar[maxn],tag[maxn];
int res[maxn];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;++i)
{
scanf("%d",&ar[i]);
}
sort(ar,ar+n);
for(int i=0;i<n;++i){
int t=ar[i];
int up=sqrt(t);
for(int j=1;j<=up;++j)
{
if(t%j==0)
{
if(tag[j])
res[t/j]=1;
if(tag[t/j])
res[j]=1;
}
}
tag[t]=1;
}
res[1]=1;
while(m--)
{
int q;
scanf("%d",&q);
if(res[q])
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复