设
设
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<complex>
#include<queue>
#include<map>
#include<set>
#define N 45000
#define ll long long
using namespace std;
int top,a[N],prime[N],ans[N];
int n,tot;
void get_prime()
{
for(int i=2;i<N;i++)
{
if(!a[i])
prime[++top]=i;
for(int j=1;prime[j]*i<N;j++)
{
a[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
}
bool jud(int x)
{
if(x==1)return 0;
for(int i=1;prime[i]*prime[i]<=x;i++)
if(x%prime[i]==0)return 0;
return 1;
}
void dfs(int now,int pos,int rest)
{
if(rest==1)
{
ans[++tot]=now;
return;
}
if(rest-1>=prime[pos]&&jud(rest-1))
ans[++tot]=(rest-1)*now;
for(int i=pos;prime[i]*prime[i]<=rest;i++)
for(ll p=prime[i],sum=p+1;sum<=rest;p*=prime[i],sum+=p)
if(rest%sum==0)
dfs(now*p,i+1,rest/sum);
}
int main()
{
get_prime();
while(scanf("%d",&n)!=EOF)
{
tot=0;
dfs(1,1,n);
sort(ans+1,ans+tot+1);
printf("%d\n",tot);
for(int i=1;i<=tot;i++)
printf("%d%c",ans[i],i==tot?‘\n‘:‘ ‘);
}
return 0;
}
原文:http://blog.csdn.net/ws_yzy/article/details/50929647