题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3629
题目大意:给定一个N,输出所有正约数之和等于N的数。
题目分析:dfs即可。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; const int maxn=1000008; int d; int n; int ans=0,way[110000]; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } bool mark[maxn]; int prim[maxn],primm; void Get_Prime() { for (int i=2;i<=100000;i++) { if (!mark[i]) prim[++primm]=i; for (int j=1;prim[j] * i<=100000;j++) { mark[prim[j]*i]=true; if (i%prim[j]==0) break; } } } bool isprime(int x) { if (x<=100000) return (!mark[x]); int d=sqrt(x); for (int i=2;i<=d;i++) if (x%i==0) return false; return true; } void dfs(int last,int now,int num) { if (now==1) { ans++; way[ans]=num; return; } if (now-1>d&&isprime(now-1)) { ans++; way[ans]=num*(now-1); } for (int i=last+1;prim[i]<=d;i++) { LL cal=1,t=prim[i]; for (int j=1;cal+t<=now;j++) { cal+=t; if (now%cal==0) dfs(i,now/cal,num*t); t*=prim[i]; } } } int main() { while (scanf("%d",&n)==1) { ans=0; d=sqrt(n); Get_Prime(); dfs(0,n,1); sort(way+1,way+1+ans); cout<<ans<<endl; for (int i=1;i<=ans;i++) { printf("%d",way[i]); if (i!=ans) printf(" "); else printf("\n"); } } return 0; }