呃呃
看到了这道题 没有任何思路…… 百度了一发题解 说要用约数和定理 就查了一发 (不会的可以先学习一下)然后呢 我们考虑枚举约数
先线性筛一遍10^5以下的 10^5以上的数可以用已经筛过的素因数枚举最后就搜一下就好了 (记得判断=1的情况)
还有 此题PE很坑爹
不能有行末空格 0的情况不用输出空行
//By SiriusRen#include#include #include using namespace std;#define N 100000int s,cnt,pri[N],Ans[N];bool p[N+5];void get_prime(){ for(int i=2;i<=N;i++){ if(!p[i])pri[++cnt]=i; for(int j=1;j<=cnt&&i*pri[j]<=N;j++){ p[i*pri[j]]=1; if(i%pri[j]==0)break; } }}bool is_prime(int x){ if(x<=N)return !p[x]; int temp=sqrt(x); for(int i=1;pri[i]<=temp;i++) if(x%pri[i]==0)return 0; return 1;}void dfs(int last,int ans,int sum){ if(sum==1){Ans[++cnt]=ans;return;} if(sum-1>pri[last]&&is_prime(sum-1))Ans[++cnt]=ans*(sum-1); for(int i=last+1;pri[i]*pri[i]<=sum;i++) for(int psum=pri[i]+1,div=pri[i];psum<=sum;div*=pri[i],psum+=div) if(sum%psum==0)dfs(i,ans*div,sum/psum);}int main(){ get_prime(); while(~scanf("%d",&s)){ cnt=0,dfs(0,1,s); sort(Ans+1,Ans+1+cnt); printf("%d\n",cnt); for(int i=1;i<=cnt;i++){ printf("%d",Ans[i]); if(i!=cnt)putchar(' '); } if(cnt)puts(""); }}