zoukankan      html  css  js  c++  java
  • bzoj1053(反素数)

    4790: Lydsy1053 反素数

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 7  Solved: 5
    [Submit][Status][Web Board]

    Description

    对于任何正整数 x,其约数的个数记作g(x)。例如g(1)=1,g(6)=4。
    如果某个正整数 x 满足:对于任意的 0<i<x,都有 g(x)>g(i),那么称 x 为反质数。例如整数 1,2,4,6 等都是反质数。
    现在给定一个数 N(1≤N≤2*〖10〗^9 ),请求出不超过N的最大的反质数。

    Input

    一个数N(1<=N<=2,000,000,000)。

    Output

    不超过N的最大的反质数。

    Sample Input

    1000

    Sample Output

    840

    HINT

    Source

    引理:1~n中最大的反素数,就是1~n中约数个数最多的数中最小的一个

    1~n中的任意数x,的约数不可能超过十个

    对于x属于1~n,若x为反素数,则将x质因数分解后次方单调递减

    所以,直接爆搜

    #include<cstdio>
    using namespace std;
    
    typedef  long long ll;
    
    int s[100];
    int ansnum,anssum;
    int n;
    int prime[20]={1,2,3,5,7,11,13,17,19,22,23,29,31};
    
    void dfs(ll num,ll sum,int x){//num为约数个数,sum为现在总和,x为到第几个素数
         if(x>12) return ;
         if(num>ansnum || (num==ansnum&&sum<anssum)){
            ansnum=num;
            anssum=sum;
            //return ;
         }
         s[x]=0;
         while(sum*prime[x]<=n&&s[x]<s[x-1]){
            s[x]++;
            //ll next=num*(s[x]+1);
            dfs(num*(s[x]+1),sum*=prime[x],x+1);
         }
    }
    
    int main(){
        scanf("%d",&n);
        s[0]=10000;
        dfs(1,1,1);
        printf("%d
    ",anssum);
    return 0;
    }
  • 相关阅读:
    01 HTTP协议_servlet基础
    JS 08表单操作_表单域
    09 多态
    JS 07 Dom
    JS 06 bom 框窗_页面_定时任务
    JS 05 json
    08 包_继承
    JS 04 Date_Math_String_Object
    【Java每日一题】20161018
    【Java每日一题】20161017
  • 原文地址:https://www.cnblogs.com/lmjer/p/9073602.html
Copyright © 2011-2022 走看看