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;
    }
  • 相关阅读:
    Linux 基础命令3 shell
    Django 的学习(2) 从adminuser到配置
    Linux巨好用的
    常见任务&基本工具 1 软件包管理
    java学习补全 1
    基础命令1
    java 5 绘图GUI
    Open GL与OpenGLES
    NDK 安装步骤
    转:为什么要有handler机制?
  • 原文地址:https://www.cnblogs.com/lmjer/p/9073602.html
Copyright © 2011-2022 走看看