题目大意:令f(x)=Σi (i|x) 给定n,求所有的x,使f(x)=n
首先约数和公式
令n=p1^a1*p2^a2*...*pk^ak
则f(n)=(1+p1+p1^2+...+p1^a1)*(1+p2+p2^2+...+p2^a2)*...*(1+pk+pk^2+...+pk^ak)
于是我们枚举质数p,采取DFS的方式求出所有值
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
int s,sqrts,top,cnt;
int ans[100000],p[50005];
bool mark[50005];
void init()
{
for(int i=2;i<=50000;i++)
{
if(!mark[i])p[++cnt]=i;
for(int j=1;p[j]*i<=50000;j++)
{
mark[p[j]*i]=1;
if(i%p[j]==0)break;
}
}
}
bool judge(int x)
{
if(x<=50000) return !mark[x];
for(int i=1;p[i]<=sqrt(x);i++)
{
if(x%p[i]==0) return 0;
}
return 1;
}
void dfs(int last,int tot,int sum)
{
if(tot==1)
{
top++;ans[top]=sum;
return;
}
if(tot-1>sqrts&&judge(tot-1)) ans[++top]=sum*(tot-1);
for(int i=last+1;p[i]<=sqrts;i++)
{
int tmp=1,t=p[i];
for(int j=1;tmp+t<=tot;j++)
{
tmp+=t;
if(tot%tmp==0)
dfs(i,tot/tmp,sum*t);
t*=p[i];
}
}
}
int main()
{
init();
while(scanf("%d",&s)!=EOF)
{
top=0;sqrts=sqrt(s);
dfs(0,s,1);
printf("%d\n",top);
sort(ans+1,ans+top+1);
for(int i=1;i<top;i++)
printf("%d ",ans[i]);
if(top)printf("%d\n",ans[top]);
}
return 0;
}