題目敘述
給定\(n, m\)下一行會有\(n\)個數字,輸出所有\(k in 1~m\),\(k\)是與所有數字皆互質的數。
範例輸入 1
範例輸出 1
題解
用埃氏篩法在\(log(n)\) 的時間內做質因數分解,接著將所有數字的質因數聯集存在 bitset 中,最後判斷\(1~m\)的所有數字的質因數之中有無存於 bitset 中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include<bits/stdc++.h> using namespace std;
using ll=long long; const ll N=100010; #define IO_SPEEDUP ios::sync_with_stdio(0);cin.tie(0); #define IO_INIT cout<<fixed<<setprecision(6);
int n,m; int pri[N]; bitset<N> bt;
void init(){ pri[1]=0; for(int i=2;i<N;++i){ if(pri[i]==0){ pri[i]=i; for(ll k=(ll)i*i;k<N;k+=i) pri[k]=i; } } }
void div(int n){ while(pri[n]>0){ bt[pri[n]]=true; n/=pri[n]; } }
bool check(int n){ while(pri[n]>0){ if(bt[pri[n]]){ return false; } n/=pri[n]; } return true; }
int main(){ IO_SPEEDUP; IO_INIT;
cin>>n>>m; init();
for(int i=0;i<n;++i){ int a; cin>>a; div(a); }
vector<int> ans; for(int i=1;i<=m;++i){ if(check(i)){ ans.emplace_back(i); } }
cout<<ans.size()<<"\n"; for(auto i:ans){ cout<<i<<"\n"; } }
|