//输入一个数,1~2^24, 输出它的最大质因子和不同质因子的个数。
//先打素数表,然后搞之。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAX=16777217;
bool prime[MAX];
int p[1080000];
int main()
{
//freopen("1.txt", "r", stdin);
int i,j, n, sum=0, T;
memset(prime,1,sizeof(prime));
prime[1]=0;
for(i=2;i<=(int)sqrt((double)MAX);i++)
{
if(prime[i])
{
j=i*2;
while(j<=MAX)
{
prime[j]=0;
j+=i;
}
}
}
int ans1, ans2=0;
for(i=2; i<=MAX; i++)
if(prime[i])p[sum++]=i;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
i=0;ans2=0;ans1=2;
while(n!=1){
if(prime[n]){ //这个优化非常重要
ans2++;
ans1=n;
break;
}
if(n%p[i]==0){
ans1=p[i];ans2++;
}
while(n%p[i]==0){
n/=p[i];
}
i++;
}
printf("%d %d\n", ans1, ans2);
}
return 0;
}
//先打素数表,然后搞之。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAX=16777217;
bool prime[MAX];
int p[1080000];
int main()
{
//freopen("1.txt", "r", stdin);
int i,j, n, sum=0, T;
memset(prime,1,sizeof(prime));
prime[1]=0;
for(i=2;i<=(int)sqrt((double)MAX);i++)
{
if(prime[i])
{
j=i*2;
while(j<=MAX)
{
prime[j]=0;
j+=i;
}
}
}
int ans1, ans2=0;
for(i=2; i<=MAX; i++)
if(prime[i])p[sum++]=i;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
i=0;ans2=0;ans1=2;
while(n!=1){
if(prime[n]){ //这个优化非常重要
ans2++;
ans1=n;
break;
}
if(n%p[i]==0){
ans1=p[i];ans2++;
}
while(n%p[i]==0){
n/=p[i];
}
i++;
}
printf("%d %d\n", ans1, ans2);
}
return 0;
}