Description escription
这颗星沾染了 天与水的颜色
淡地 彩虹的轮廓清晰了 又模糊了
迷人眼的夜色
你所吟唱的歌 究竟能
传达到这世界多远的角落
每个星球都有自己的一标号 每个星球都有自己的一标号 每个星球都有自己的一标号 每个星球都有自己的一标号 每个星球都有自己的一标号 每个星球都有自己的一标号 S,不断吟唱歌曲呼唤着另一个星球 ,,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 S,为了 ,为了 Heavenly Bule Heavenly BuleHeavenly Bule Heavenly Bule Heavenly BuleHeavenly BuleHeavenly BuleHeavenly Bule (神圣的蓝色),这个任 (神圣的蓝色),这个任 (神圣的蓝色),这个任 (神圣的蓝色),这个任 务就交给你了,追击的骑士!( -Point of No ReturnPoint of No Return Point of No Return Point of No Return Point of No ReturnPoint of No Return -)
Input Input
输入包含 T组数据
对于每组数据
输入包含一个标号 S
OutputOutput Output
对于每组数据
输出有两行,第一那些可能的星球个数 M,第 二行输出 M个标号,表示 那些星球, 标号请升序输出。 标号请升序输出。 标号请升序输出。 标号请升序输出。
Sample input
42
Sample output
3
20 26 41
Hint
30% S<=10^5
100% S<=2*10^9 ,T<=100
PS. 没有请输出 0
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
int S,n,m,q,i,j,k;
int d[10005],ans[1000005];
int f[1000005];
bool pri[100005];
long long a,b;
struct node
{
int p,pp;
}p[10005];
bool isprime(int x)
{
int i,j=(int)sqrt(x);
for(i=2;i<=j;++i)
if(x%i==0)
return false;
return true;
}
int gcd(int a,int b)
{
if(!b)
return a;
return gcd(b,a%b);
}
void dfs(int x,int y,int z)
{
if(z==S)
{
ans[++q]=y;
return;
}
if(x>m)
return;
if(p[x].pp>S/z)
return;
dfs(x+1,y,z);
if(gcd(y,p[x].p)==1)
dfs(x+1,y*p[x].p,z*p[x].pp);
}
inline bool cmp(const node &a,const node &b)
{
return a.pp<b.pp;
}
int main()
{
freopen("heavenly.in","r",stdin);
freopen("heavenly.out","w",stdout);
for(i=2;i<=100000;++i)
for(j=i+i;j<=100000;j+=i)
pri[j]=true;
while(scanf("%d",&S)!=EOF)
{
n=m=q=0;
for(i=1,j=(int)sqrt(S);i<=j;++i)
if(S%i==0)
{
d[++n]=i;
if(i!=S/i)
d[++n]=S/i;
}
sort(d+1,d+n+1);
for(i=1;i<=n;++i)
{
if(d[i]>2&&isprime(d[i]-1))
p[++m].p=d[i]-1,p[m].pp=d[i];
for(j=2,k=(int)sqrt(d[i]);j<=k;++j)
if(!pri[j])
{
a=1;b=1;
while(a<d[i])
b*=j,a+=b;
if(a==d[i])
{
p[++m].p=b;
p[m].pp=d[i];
}
}
}
sort(p+1,p+m+1,cmp);
dfs(1,1,1);
sort(ans+1,ans+q+1);
printf("%d\n",q);
for(i=1;i<=q;++i)
{
printf("%d",ans[i]);
if(i==q)printf("\n");
else printf(" ");
}
}
return 0;
}