线性筛和os数组(牛客多校25年#7-G)
线性筛
1.一个平方数一定是某若干个质数的偶次方
2.os(k)表示k经过质因数分解后指数的和,其有性质:os(M*N) = os(M) + os(N)
3.对于一个数k * prime,其os = os(k) + 1
4.题目的os[x*y*z] = os(x) + os(y) + os(z),如果os|x,y,z都为奇数,则必满足题意
5.有证明表明此题n的范围一定存在这样n/2个数
#include<bits/stdc++.h>
using namespace std;
const int N = 2e6;
bool st[N + 10];
int os[N + 10];
vector<int>primes;
void Ls()
{os[1] = 0;for(int i = 2;i <= N;i ++){if(!st[i]){primes.push_back(i);os[i] = 1;}for(int prime:primes){if(1LL * prime * i >= N)break;st[i * prime] = true;os[i * prime] = os[i] + 1;if(i % prime == 0)break;}}
}
int main()
{ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);Ls();int t;cin >> t;while(t --){int n;cin >> n;vector<int>res;for(int i = 1;i <= n; i++){if(os[i] & 1)res.push_back(i);if((int)res.size() >= n / 2)break;}for(int it:res)cout << it << " ";cout << endl;}return 0;
}