https://www.luogu.com.cn/problem/P8799
这个代码在数据加强之后有一个测试点没过
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
LL a[N],mp[N];
bool st[N];
int main()
{
int n,m; cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(mp[a[i]]) st[1]=true;
mp[a[i]]++;
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
{
if(a[i]==a[i-1]) continue;//这个小优化竟然又能多过几个数据
for(LL j=a[i];j<=a[n];j+=a[i])
{
if(!mp[j]) continue;//没有出现过这个次数
int t=j/a[i];
st[t]=true;
}
}
while(m--)
{
int x; cin>>x;
if(st[x]) puts("YES");
else puts("NO");
}
return 0;
}
下面这个是全国的,特例有点莫名其妙
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn = 4e5+10;
LL a[maxn], mp[maxn], ans[maxn]; //表示倍数i能否被表示
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
LL n, m; cin>>n>>m;
for(LL i = 1; i <= n; i++){
cin>>a[i]; mp[a[i]]++;
}
sort(a+1,a+n+1);
for(LL i = 1; i <= n; i++){
if(i>1 && a[i]==a[i-1])continue; //跑过了不用跑
for(LL j = a[i]; j <= a[n]; j+=a[i]){//枚举每个数的倍数
if(!mp[j])continue;
if(mp[j]==1 && j==a[i])continue;
ans[j/a[i]] = 1; //两个数都出现过且能整除,那么就能表示这个倍数
}
}
// 据说数据锅了
if(n==1 && a[1] == 123){
cout<<"YES"<<endl<<"NO"<<endl; return 0;
}
while(m--){
LL x; cin>>x;
if(ans[x])cout<<"YES\n";else cout<<"NO\n";
}
return 0;
}