质因数 欧拉线筛变形

质因数 欧拉线筛变形

题目:

质因数

(prime.cpp/in/out 1s 128M)

OtosakaYuu最近为了Nao Tomori拯救世界而立了一个flag,于是他想了一道数学题。有一个正整数数列a1,a2an。定义函数f(x)x的不同的质因数数量。球f(a1),f(a2)f(an)

Input

第一行包含一个正整数,表示n

接下来n行,每行包含一个正整数ai

1<=n<=1000000,2<=ai<=1000000

Output

输出n行,第i行输出f(ai)

Sample Input

3

12

30030

2333

Sample Output

2

6

1

【样例说明】 

12=2×2×3

30030=2×3×5×7×11×13

2333是一个质数。

code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e6+15;
 4 int n;
 5 int prime[maxn],inprime[maxn],a[maxn];
 6 inline int read(){
 7     int x=0,f=1;char ch=getchar();
 8     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
 9     while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
10     return x*f;
11 }
12 void work(){
13     memset(inprime,1,sizeof(inprime));
14     for (int i=2;i<=maxn;i++)
15         if (inprime[i])
16         {
17             for (int j=i;j<=maxn;j+=i)   prime[j]++;
18             for (int j=i;j<=maxn/i;j++) inprime[i*j]=0;
19         }
20 }
21 int main()
22 {
23     n=read();
24     for (int i=1;i<=n;i++)   a[i]=read();
25     work();
26     for (int i=1;i<=n;i++)   printf("%d\n",prime[a[i]]);
27     return 0;
28 }