拜托了,牛老师
题目大意:
给定一个数n,对他进行严格的因数分解,且分解的因数个数要大于1,求这些因数和的最小值。
严格因数分解:因数中无重复
输入描述:
一个数 n ( 2 ≤ n ≤ 1 0 6 ) n(2 \le n \le 10^6) n(2≤n≤106)
输出描述:
因数和的最小值
样例:
样例输入1:
18
样例输出1:
9
说明:
18可以分解成 1 * 18,2 * 9,3 * 6,显然 3 + 6 = 9是最优的
(18 = 2 * 3 * 3 由于有重复值所以无法得到)。
样例输入2:
3
样例输出2:
4
说明:
4
思路:
首先想到的竟然是二分
递归求解,每次将n分成两个数相乘,将其中的一个数进入下一层递归继续求解,另一个数则标记一下不能再使用,在递归的开始求出当前总和并和最小值比较。
A C AC AC C o d e : Code: Code:
七夕节快乐!(孤寡)
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e6+5;
int n,ans,t[MAXN];
void f(int x,int sum){
if(sum&&!t[x]) ans=min(ans,sum+x);
for(int i=2;i<=x;++i)
if(x%i==0&&!t[i]&&i!=n/i){
t[i]++;
f(x/i,sum+i);
t[i]--;
}
}
int main(){
scanf("%d",&n);
ans=n+1;
f(n,0);
printf("%d\n",ans);
}