P1002 a+b+c
一定都是
的质因子乘积的组合
考虑把进行质因数分解 然后把质因数分配给
因为 所以最多有不超过25个因子
比如有个2 我们枚举
有
个
有
个
那么不同的分配方式是
先对进行质因数分解 然后维护好每一种因子的个数
总的复杂度
TO验题人:
实际上本机测试这题数据出到1e9都没问题
但是牛客验题机波动问题 就算数据缩小到1e7了 测试点8,9,16还是一直抖动
跑下来的一会5ms 一会1001ms超时 体验极差
如果这个问题解决了 可以再加强数据
class Solution {
public:
/**
*
* @param n int整型 n
* @return int整型
*/
int aa[50];
int bb[50];
int ans, cnt;
void dfs(int dep, int a, int b, int c) {
//if(a + b + c > ans) return; //可以剪枝
if(dep > cnt) {
ans = min(ans, a + b + c);
return;
}
for(int i = 0; i <= bb[dep]; i++)
for(int j = 0; i + j <= bb[dep]; j++) {
int ta = 1, tb = 1, tc = 1;
for(int k = 1; k <= i; k++) ta *= aa[dep];
for(int k = 1; k <= j; k++) tb *= aa[dep];
for(int k = 1; k <= bb[dep] - i - j; k++) tc *= aa[dep];
dfs(dep + 1, a * ta, b * tb, c * tc);
}
}
int solve(int n) {
// write code here
ans = n + 5;
cnt = 0;
for(int i = 2; i * i <= n; i++) {
if(n % i == 0) aa[++cnt] = i;
while(n % i == 0) {
n /= i;
bb[cnt]++;
}
}
if(n != 1) aa[++cnt] = n, bb[cnt] = 1;
dfs(1, 1, 1, 1);
return ans;
}
};