欧拉筛+快读
先用欧拉筛得出所有的素数,然后用类欧拉筛方法初始化ans数组,得到每个数的非素因子数
- 第一层循环从1到MAXN,代表每个因子,
- 第二层循环遍历所有这个因子i的倍数 j,这些 j 代表的数中肯定含有因子i,所以将这些数的ans统统加一,排除素数的i后,就完成了ans数组的初始化。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <iomanip>
#include <assert.h>
#include <bitset>
using namespace std;
#define eps (1e-6)
#define LL long long
#define pi acos(-1.0)
#define rd(a) (a = read())
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(x,to) for(int x=0;x<(to);++x)
#define FORR(x,arr) for(auto& x:arr)
#define LOOP(x,k,to) for(int x=k;x<(to);++x)
#define ITR(x,c) for(auto x=c.begin();x!=c.end();x++)
#define ALL(a) (a.begin(),(a.end())
#define ZERO(a) memset(a,0,sizeof(a))
#define MINUS(a) memset(a,0xff,sizeof(a))
#define IOS cin.tie(0) , cout.sync_with_stdio(0)
#define DEBUG(a,b) cout << "#" << (a) << " " << (b) << endl;
#define DEBUGf(a,b) cout << "$" << (a) << " " << (b) << endl;
const int INF = 0x3f3f3f3f;
const int maxn = 2e6+2;
int n;
bool isprime[maxn+1];
int ans[maxn+1];
void read(int& x) {
int f = 1; x = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {if (ch == '-') f = -1; ch = getchar();}
while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
x *= f;
}
void init()
{
isprime[1] = 0;
for(int i=2; i<=maxn; ++i) isprime[i] = true;
for(int i=2; i*i<=maxn; ++i){
if(isprime[i]){
for(int j=i*i; j<=maxn; j+=i)
isprime[j] = false;
}
}
ZERO(ans);
for(int i=1; i<=maxn; ++i){
for(int j=i; j<=maxn; j+=i){
if(!isprime[i])
ans[j]++;
}
}
}
int main()
{
init();
int t;
read(t);
while(t--){
read(n);
printf("%d\n",ans[n]);
}
return 0;
}