zoukankan      html  css  js  c++  java
  • zoj 2562 反素数

    题目大意:求n范围内最大的反素数(反素数定义:f(x)表示x的因子数,f(x)>f(x1) (0<x1<x))

    x用质因数形式为:x=a1^p1*a2^p2......an^pn(ai为素数),那么一个数的因子个数f(x)=(p1+1)*(p2+1)*....*(pn+1)

    反素数的性质有:x=a1^p1*a2^p2......an^pn,p1>=p2>=......>=pn

    证明:若pi<pj(i<j),那么存在与它因子个数相等的x1且x1<x,与反素数的定义矛盾。

    前十四个素数每个素数用一次的乘积已经大于10^16,所以枚举前十四个素数就可以了。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    typedef long long LL;
    int prime[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
    LL n,ans,Max;
    
    void dfs(LL sum,LL num,LL k,LL t)
    {
        if(sum>Max) {Max=sum;ans=num;}
        if(sum==Max && num<ans) ans=num;
        if(k>14) return ;
        LL temp=num;
        for(int i=1;i<=t;i++)
        {
            if(temp*prime[k]>n) break;
            temp*=prime[k];
            dfs(sum*(i+1),temp,k+1,i);
        }
    }
    
    int main()
    {
        while(~scanf("%lld",&n))
        {
            ans=n;Max=0;
            dfs(1,1,0,50);
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Parcel与Parcelable剖析
    Binder文集
    Charles 使用教程
    AsyncTask
    Android 编译时注解
    scanf(),gets(),getchar()
    银行家算法
    最长公共子序列(LCS)问题
    动态规划 求解数字三角形最大值
    参数 存在二维数组
  • 原文地址:https://www.cnblogs.com/xiong-/p/3244747.html
Copyright © 2011-2022 走看看