拜托了,牛老师(DFS)
思路: d f s dfs dfs,因为 n n n最大只有 1 e 6 1e6 1e6,考虑因数最多只有两百多,因为要求因数不同,可以考虑以递增顺序剪枝 d f s dfs dfs。
时间复杂度: O ( k n ) O(k\sqrt{n}) O(kn )
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
int ans;
void dfs(int n,int x,int s){ //x是表示下一个数是,s表示当前因数和.
x==1?x=2:ans=min(ans,s+n);
for(;x*x<n;x++) if(n%x==0) dfs(n/x,x+1,s+x);
//这里要求x*x<n 因为要求递增 至少是x x+1 .....
}
int main(){
int n;
scanf("%d",&n);
ans=n+1;dfs(n,1,0);
printf("%d\n",ans);
return 0;
}