P5697 题解
题目传送门
思路
本题是一道搜索。
分析过样例后,你会发现从上一次搜下来的数,一直到
经过排序后就是我们要的答案。
AC CODE
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,ans[N],num;
map<int,bool>mp;
void dfs(int p,int x,int cnt){
if(x<=p){//没超出答案范围
int temp=cnt+p-1;
if(!mp[temp]){//去重
ans[++num]=temp;
mp[temp]=true;
}
}
int sqrt_p=sqrt(p);
for(int i=x;i<=sqrt_p;++i)
if(!(p%i))//是p(n÷i)的质因子
dfs(p/i,i,cnt+i-1);//接着搜
return;
}
int main(){
scanf("%d",&n);
dfs(n,2,0);//2是最小的质数,故从2开始
printf("%d\n",num);
sort(ans+1,ans+num+1);//排序
for(int i=1;i<=num;++i)
printf("%d ",ans[i]);
return 0;
}