题意及思路
- 题意:判断2到m中,有多少个数是“合法的”,“合法的”概念在题目中给出。
- 思路:主要思想是,维护一个大数组,进行更新check迭代。🙄第一步,将输入的集合S中元素在大数组中的位置置为true(意即合法的)。😏第二步,就是循环遍历2-m,检查迭代更新。
这里面就重要的代码就是,check(int x)函数。🤔基本做法是,进行循环遍历2至x/2这些数,检查一下原来的大数组中,x的当前真因数 i 和 x/i 是否合法,遇到一个不合法的即当前x不合法。
代码
#include<bits/stdc++.h> using namespace std; const int M = 3*1e5+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)); int n, m, ans = 0; cin >> n >> m; for( int i = 0; i < n; i++ ) { int x; cin >> x; vis[x] = true; } for(int i = 2; i <= m; i++ ) if(check(i)) ans++; cout << ans << endl; } return 0; }