题目
题解思路
大概就是X只能由X的倍数gcd出来。所以我们直接枚举他的倍数存不存在,存在就gcd一下。最后保存最后结果防止下次还搜。
优化后复杂度大概 mlogn 。
这题还卡memset,我麻了。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
int f[1000100] ;
int a[1000100] ;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T ;
cin >> T ;
while (T--)
{
memset ( f , 0 , sizeof(f) ) ;
memset ( a , 0 , sizeof(a) ) ;
int n , m ;
cin >> n >> m ;
for (int i = 1 ; i <= n ; i++ )
{
int t1 ;
scanf("%d",&t1) ;
a[t1] = 1 ;
}
while ( m -- )
{
int x ;
scanf("%d",&x) ;
if ( f[x] == 0 )
{
int fx = -1 ;
for (int i = x ; i <= n ; i+=x )
{
if (a[i])
{
if (fx==-1)
fx = i ;
else
fx = __gcd(i,fx) ;
}
if (fx == x )
break ;
}
if (fx == x )
{
f[x] = 1 ;
printf("YES\n") ;
}else
{
f[x] = -1 ;
printf("NO\n") ;
}
}else if ( f[x] == 1 )
{
printf("YES\n") ;
}else
printf("NO\n") ;
}
}
return 0 ;
}