雪球和大栗在玩一个数学游戏,雪球每次告诉大栗一个数n(n>1),大栗需要找到一个数列 a1,a2……..ak 满足
1、每个 ai 都大于1;
2、a1 * a2 * … * ak = n
3、ai+1 被 ai 整除 (1 <= i <= k - 1)
4、k 是最大的情况
如果有多个满足k最大的序列,给出任何一个有效序列即可。
思路: 质数唯一分解定理,把n分解为a1^p1*a2^p2...这种形式。
而我们要找的最大值的k就是p数组的最大值,假设最大值pi。
那么我们可以拆成 pi-1个ai和一个n/pow(ai,pi-1)。如果pi为一的时候需要特判一下。
ac代码如下
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
#define fi first
#define sc second
#define int long long
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define rep(i,m,n) for(int i=m;i<n;i++)
const int maxn=1e3+7;
int a[maxn];
int p[maxn];
int cnt=0;
void f(int n){ //质数唯一分解
for(int i=2;i*i<=n;i++){ //这里不优化会超时
if(n%i==0){
a[cnt]=i;
while(n%i==0){
p[cnt]++;
n/=i;
}
cnt++;
}
if(n==0) break;
}
if(n!=1){
p[cnt]=1;
a[cnt]=1;
cnt++;
p[cnt]=1;
a[cnt]=n;
cnt++;
}
}
int qpow(int a,int b){ //快速幂
int res=1;
while(b){
if(b&1){
res=res*a;
}
b>>=1;
a=a*a;
}
return res;
}
signed main(){
int n;
int t;
cin>>t;
while(t--){
cnt=0;
memset(a,0,sizeof(a));
memset(p,0,sizeof(p));
scanf("%lld",&n);
f(n);
// rep(i,0,cnt){
// cout<<a[i]<<" "<<p[i]<<endl;
// }
int mi=-1;
int ma=0;
rep(i,0,cnt){
if(mi<=p[i]){
mi=p[i];
ma=a[i];
}
}
if(mi==1){
printf("1\n%lld\n",n);continue;
}
printf("%d\n",mi);
for(int i=1;i<=mi-1;i++)
printf("%d ",ma);
printf("%lld\n",n/(long long)qpow(ma,mi-1));
//
}
}