牛客Game with numbers(暴力)

链接: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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值