• 【bzoj1053】[HAOI2007]反素数ant


    对于任何正整数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
     

    本题似乎要先知道许多结论,不要问我证明。。

    一个数约数个数=所有素因子的次数+1的乘积
    举个例子就是48 = 2 ^ 4 * 3 ^ 1,所以它有(4 + 1) * (1 + 1) = 10个约数

    然后可以通过计算得一个2000000000以内的数字不会有超过12个素因子

    并且小素因子多一定比大素因子多要优

    预处理出前12个素数直接爆搜即可

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 
     7 #define inf 0x7fffffff
     8 #define ll long long 
     9 using namespace std;
    10 
    11 int n,ans=1,num=1;
    12 int p[15]={0,2,3,5,7,11,13,17,19,23,29,31};
    13 
    14 void dfs(int k,ll now,int cnt,int last)
    15 {
    16     if(k==12)
    17     {
    18         if(now>ans&&cnt>num){ans=now;num=cnt;}
    19         if(now<=ans&&cnt>=num){ans=now;num=cnt;}
    20         return;
    21     }
    22     int t=1;
    23     for(int i=0;i<=last;i++)
    24     {
    25         dfs(k+1,now*t,cnt*(i+1),i);
    26         t*=p[k];
    27         if(now*t>n)break;
    28     }
    29 }
    30 int main()
    31 {
    32     scanf("%d",&n);
    33     dfs(1,1,1,20);
    34     printf("%d",ans);
    35 }
  • 相关阅读:
    书法的艺术
    书法的艺术
    matlab gabor 滤波器
    matlab gabor 滤波器
    生活中的物理学(电学)
    生活中的物理学(电学)
    CCD 与 CMOS
    CCD 与 CMOS
    博物院与国宝
    【设计模式】学习笔记13:组合模式(Composite)
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/7598971.html
Copyright © 2020-2023  润新知