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;
    }
};
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务