思路:找出最大公约数,然后唯一分解求出因子数和所有因子就ok了
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#define max(a,b) a>b?a:b
using namespace std;
typedef long long ll;
const int N=4e4;
bool p[N];
int prime[N],tot=0;
int cnt=0;
void init(){
p[0]=p[1]=true;
for(int i=2;i<N;i++){
if(!p[i]) prime[tot++]=i;
for(int j=0;j<tot&&(ll)i*prime[j]<N;j++){
p[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
}
int a[66],res[66];
int q[N<<1],fail=0;
void dfs(int pos,int x){
if(pos>cnt){
q[fail++]=x;
return ;
}
dfs(pos+1,x);
for(int i=1;i<=res[pos];i++){
x*=a[pos];
dfs(pos+1,x);
}
}
int main(){
init();
int T;
scanf("%d",&T);
while(T--){
cnt=0;
fail=0;
int V;
scanf("%d",&V);
int v=V;
int sum=0;
while(v){
sum+=v%10;
v/=10;
}
int g=__gcd(V,sum);
int m=1;
for(int i=0;i<tot;i++){
if(g==1) break;
if(g%prime[i]==0){
cnt++;
a[cnt]=prime[i];
res[cnt]=0;
while(g%prime[i]==0){
res[cnt]++;
g/=prime[i];
}
m*=(res[cnt]+1);
}
}
if(g!=1){
cnt++;
a[cnt]=g;
res[cnt]=1;
m*=2;
}
printf("%d\n",m);
dfs(1,1);
sort(q,q+fail);
for(int i=0;i<m;i++) printf("%d%c",q[i]," \n"[i==m-1]);
}
return 0;
}