链接:https://ac.nowcoder.com/acm/contest/942/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给定大小为n{n}n的集合S{S}S
一个数x{x}x被称为合法的,当且仅当x∈S{x ∈ S}x∈S或者x{x}x存在大于1{1}1的真因数,且这些真因数均是合法的
求有多少个数x{x}x满足2≤x≤m2 \leq x \leq m2≤x≤m且x{x}x合法
PS:x{x}x的真因数指不是x{x}x本身的约数
输入描述:
第一行数据组数T{T}T,表示共T{T}T组数据
对于每组数据
第一行数字n,m{n,m}n,m,含义如上文所示
接下来一行n{n}n个数字,表示S{S}S中的元素
输出描述:
对于每组数据输出一行一个数字表示答案
示例1
输入
复制
1 3 10 2 3 4
输出
复制
6
说明
2,3,4,6,8,9{2,3,4,6,8,9}2,3,4,6,8,9是合法的
备注:
对于20%{20\%}20%的数据,1≤n,m≤1001 \leq n,m \leq 1001≤n,m≤100
对于50%{50\%}50%的数据,1≤n,m≤10001 \leq n,m \leq 10001≤n,m≤1000
对于100%{100\%}100%的数据,1≤n<m≤3×1051 \leq n < m \leq 3\times 10^{5}1≤n<m≤3×105,2≤Si≤m2 \leq S_{i} \leq m2≤Si≤m,SiS_{i}Si互不相同,1≤T≤51\leq T \leq 51≤T≤5
#include<bits/stdc++.h>
using namespace std;
const int M = 3e5+5;
bool vis[M];
bool check( int x )
{
if(vis[x]) return true;
bool flag = true;
for( int i = 2; i*i <= x; i++ )
if( x%i == 0 )
{
flag = false;
if( !vis[i] || !vis[x/i] ) return false;
}
if( flag ) return false;
return vis[x]=true;
}
int main()
{
int T;
cin >> T;
while( T-- )
{
memset(vis,false,sizeof(vis));
//S.clear();
int n, m, ans = 0;
cin >> n >> m;
for( int i = 0; i < n; i++ )
{
int x;
cin >> x;
vis[x] = true;
//S.insert(x);
}
for(int i = 2; i <= m; i++ )
if(check(i)) ans++;
cout << ans << endl;
}
return 0;
}
//God bless me