zoukankan      html  css  js  c++  java
  • codeforces 27 E. Number With The Given Amount Of Divisors(数论+dfs)

    题目链接:http://codeforces.com/contest/27/problem/E

    题意:问因数为n个的最小的数是多少。

    题解:一般来说问到因数差不多都会想到素因子。

    任意一个数x=(p1^a1)*(p2^a2)*(p3^a3)*......*(pn^an);p表示素数。

    然后因子数就是ans=(a1+1)*(a2+1)*(a3+1)*....*(an+1) 这个很显然。然后要使得x最小而且ans最大

    显然要优先选择最小的素数。

    拿12=(2^2)*3为样例可以建一个搜索树于是dfs就可以按照这棵树来写。

    //deep表示深度也就是素数的种类,sum表示组成的数,然后num表示因数个数,由于n最多为1000,2^10次为1024,所以理论上只要存10个素数就行了。

    void dfs(int deep , ull sum , int num) {

        if(num == n) ans = min(ans , sum);

        for(int i = 1 ; i <= 1000 ; i++) {

            if(num * (i + 1) > n || sum * prime[deep] > ans) break;//很明显的一个剪枝

            dfs(deep + 1 , sum * prime[deep] , num * (i + 1));

            sum *= prime[deep];

        }

    }

    #include <iostream>
    using namespace std;
    typedef unsigned long long ull;
    ull ans;
    int prime[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53} , n;
    void dfs(int deep , ull sum , int num) {
        if(num == n) ans = min(ans , sum);
        for(int i = 1 ; i <= 1000 ; i++) {
            if(num * (i + 1) > n || sum * prime[deep] > ans) break;
            dfs(deep + 1 , sum * prime[deep] , num * (i + 1));
            sum *= prime[deep];
        }
    }
    int main() {
        cin >> n;
        ans = ULLONG_MAX;
        dfs(0 , 1 , 1);
        cout << ans << endl;
        return 0;
    }
    
  • 相关阅读:
    Retrofit的使用
    解决Android Studio在Ubuntu上出现“sdk/platform-tools/adb: error=2, No such file or directory”的方法
    safair浏览器页面局部滑动问题
    App网络测试
    App测试理论简介
    JS -- 流程控制语句
    JS -- DOM(文档对象模型)
    JS -- 操作符和数组
    JS -- 基础语法1
    JS -- JavaScript简介
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6893237.html
Copyright © 2011-2022 走看看