• BZOJ 1053 反素数


    Description

    对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。
    如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。
    现在给定一个数N,你能求出不超过N的最大的反质数么?

    Input

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

    Output

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

    Sample Input

    1000

    Sample Output

    840

    HINT

     

    Source

    开始没有想清楚这个问题的本质,半小时后才发现这TM不就是要求1-n中约数最多的最小数。(自己稍微yy一下应该就可以了。)

    然后我们就要求1-n中约数最多的最小数。这个我们采用暴搜的方法,枚举每个质数的质数,推过去即可。

    开始我的质数范围是1-√n,果断TLE。其实只要用前12个质数就可以了,因为质数大了反而没有小质数对答案的贡献那么大。

     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 using namespace std;
     5 
     6 typedef long long ll;
     7 int best,most,n,tot = 12;
     8 int prime[15] = {0,2,3,5,7,11,13,17,19,23,29,31,37};
     9 
    10 inline void dfs(ll now,ll num,int last)
    11 {
    12     if (num > most) most = num,best = now;
    13     else if (num == most && now < best) best = now;
    14     for (int i = last;i <= tot;++i)
    15     {
    16         ll key = 1;
    17         for (int j = 1;;++j)
    18         {
    19             key *= (ll)prime[i];
    20             if (now*key > n) break;
    21             dfs(now*key,num*(j+1),i+1);
    22         }
    23     }
    24 }
    25 
    26 int main()
    27 {
    28     freopen("1053.in","r",stdin);
    29     freopen("1053.out","w",stdout);
    30     scanf("%d",&n); 
    31     dfs(1,1,1); printf("%d",best);
    32     fclose(stdin); fclose(stdout);
    33     return 0;
    34 }
    View Code
  • 相关阅读:
    《Linux内核分析》第七周学习笔记
    《深入理解计算机系统》第七章学习笔记
    《Linux内核设计与实现》第三章学习笔记
    《Linux内核分析》第六周学习笔记
    《Linux内核设计与实现》第十八章学习笔记
    《Linux内核分析》第五周学习笔记
    20182319彭淼迪 2018-2019-1《程序设计与数据结构》课程总结
    实验九报告
    第十周学习总结
    haffman树的实现
  • 原文地址:https://www.cnblogs.com/mmlz/p/4285019.html
Copyright © 2020-2023  润新知