• 【数学】【CF27E】 Number With The Given Amount Of Divisors


    传送门

    Description

    给定一个正整数(n),输出最小的整数,满足这个整数有n个因子

    Input

    一行一个整数(n)

    Output

    一行一个整数,代表答案。

    Hint

    (1~leq~n~leq~1000)。保证答案不超过(10^{18})

    Solution

    经典题。

    引理:

    对于一个唯一分解式形如(x=p_1^{c_1}p_2^{c_2}p_3^{c^3}cdots p_k^{c_k})的数字(x),则其因数个数为(prod(c_i+1))

    证明:

    考虑乘法原理,第(i)项的指数有(0~sim~c_i)(c_i+1)种方式,根据唯一分解定理的逆定理,每一项指数不同所得到的数是不同的。于是根据乘法原理,其因数个数为(prod(c_i+1))

    证毕。

    定理:

    考虑一个因数个数为(n)的最小整数(x),则它的唯一分解式(x=p_1^{c_1}p_2^{c_2}p_3^{c^3}cdots p_k^{c_k})中,不妨设(p_1~<~p_2~<~p_3~<~cdots~<~p_k),则一定满足:(p_1=2),且(forall ~i~>~1)(p_i)是大于(p_{i-1})的第一个质数,同时(forall~i~in~[1,k))(c_i~leq~c_{i+1})

    证明:

    1、若(p)在质数表上不是连续的,不妨设(p_i~<~q~<p_{i+1}),则将(p_{i+1})替换为(q)(x)会变小,因为(c_{i+1})不变,根据引理,因数个数不变。于是替换为(q)答案更优,这与(x)是最小的有(n)个因子的数矛盾。

    2、若(c_i)不是单调不升,不妨设(c_i~<~c_{i+1}),则将两指数交换,(x)会变小。同上可证因数个数不变。于是交换后答案更优,这与(x)是最小的有(n)个因子的数矛盾。

    证毕。

    于是发现答案的唯一分界式,(2)一定会出现且指数最大。考虑(2^{64})已经大于(10^{18}),所以指数最多为(64)。又发现前15个质数连乘的答案已经大于(10^{18}),所以质数最多是15个。于是爆搜一下,分别进行一下可行性剪枝和最优性剪枝,即可通过本题。

    Code

    #include<cstdio>
    #define rg register
    #define ci const int
    #define cl const long long
    
    typedef long long int ll;
    
    template <typename T>
    inline void qr(T &x) {
    	rg char ch=getchar(),lst=' ';
    	while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
    	while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    	if(lst == '-') x=-x;
    }
    
    namespace IO {
    	char buf[120];
    }
    
    template <typename T>
    inline void qw(T x,const char aft,const bool pt) {
    	if(x < 0) {x=-x,putchar('-');}
    	rg int top=0;
    	do {IO::buf[++top]=x%10+'0';} while(x/=10);
    	while(top) putchar(IO::buf[top--]);
    	if(pt) putchar(aft);
    }
    
    template <typename T>
    inline T mmax(const T a,const T b) {return a > b ? a : b;}
    template <typename T>
    inline T mmin(const T a,const T b) {return a < b ? a : b;}
    template <typename T>
    inline T mabs(const T a) {return a < 0 ? -a : a;}
    
    template <typename T>
    inline void mswap(T &_a,T &_b) {
    	T _temp=_a;_a=_b;_b=_temp;
    }
    
    const int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
    
    int n;
    ll ans=1000000000000000001;
    
    void dfs(ll,int,int,int);
    
    int main() {
    	qr(n);
    	dfs(1ll,0,64,1);
    	qw(ans,'
    ',true);
    	return 0;
    }
    
    void dfs(ll now,int cur,int p,int cnt) {
    	if(cnt > n) return;
    	if(now <= 0ll) return;
    	if(now > ans) return;
    	if(cur > 15) return;
    	if(cnt == n) {ans=now;return;}
    	for(int i=1;i<=p;++i) {
    		dfs(now*=prime[cur],cur+1,i,cnt*(i+1));
    	}
    }
    

    Summary

    对于一个唯一分解式形如(x=p_1^{c_1}p_2^{c_2}p_3^{c^3}cdots p_k^{c_k})的数字(x),则其因数个数为(prod(c_i+1))

  • 相关阅读:
    Bootstrap3.0学习第八轮
    内存管理相关的信息
    SVN merge
    Asp.Net MVC 3
    formValidator
    jquery 分页控件2
    从零开始学C++之STL(四):算法简介、7种算法分类
    (Java实现) 过河卒
    (Java实现) N皇后问题
    (Java实现) N皇后问题
  • 原文地址:https://www.cnblogs.com/yifusuyi/p/9901071.html
Copyright © 2020-2023  润新知