• bzoj1053题解


    【题意分析】

      本题中,x被称为反质数,当且仅当没有任意一个严格小于x的正整数的约数个数大于x的约数个数。求不超过N的最大反质数。

    【解题思路】

      数据范围中最大的N=2*109

      首先可以证明,不超过N的反质数不会拥有9个以上的不同质因数。因为2*3*5*7*11*13*17*19*23*29=6469693230>6*109>N。

      设某数n=∏piki(pi<pi+1),则其约数个数g(n)=∏(ki+1)。(因为每个质数对约数个数的贡献是相互独立的,质数pi的可能选择方案数为(ki+1),所以可以用乘法原理乘起来)。

      显然,对于相同的顺序序列k,选择越小的pi越优,于是最优选择方案就是选择前9个质因数。

      于是暴力枚举的状态数为∏[logpN],则其至多为[log2N]*[log3N]*[log5N]*[log7N]*[log11N]*[log13N]*[log17N]*[log19N]*[log23N]=3779758080。

      显然直接暴力是无法过的,于是需要一些鲁(吉)棒(丽)或玄(松)学(爷)优化。

      所谓鲁棒优化,就是打表。。先把所有的反质数用上面这个爆搜打出来存在表里,然后二分查找即可。

      打表做法的可行性得益于反质数个数的增长极其缓慢,105的数据范围中只有30个反质数,从下图不难看出。

      玄学优化呢,有两种方法:

    •方法一:考虑对ki的枚举进行优化。一种朴素的想法是同一个素因数的个数过多一定不利于让答案最优,而且越大的质因数个数应当越少,于是可以面向数据调参,限制ki枚举的上限。

    •方法二:部分记忆化,f[i][j]表示j的乘积分配给第i个开始的质数最大能达到的约数个数,然后可以对超出记忆化范围的搜索做下界减枝。

      复杂度O(松)。

    【参考代码】

      然而当时这题我只用了玄学优化方法一的弱化版,不知为什么就0ms过了?!

      可能有更加紧确的复杂度分析或者bz的数据有毒。。无论是哪一点请读者指出,不胜感激。

     1 #include<cstdio>
     2 #define REP(I,start,end) for(int I=start;I<=end;I++)
     3 const int prime[16]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
     4 long long maxsum, bestnum, n;
     5 void getantiprime(long long num, long long k,long long sum,int limit)
     6 {
     7     int i;
     8     long long temp;
     9     if(sum>maxsum)
    10     {
    11         maxsum=sum;
    12         bestnum=num;
    13     }
    14     if(sum==maxsum&&bestnum>num)
    15     bestnum=num;
    16     if(k>15)
    17         return;
    18     temp=num;
    19     REP(i,1,limit)
    20     {
    21         if(temp*prime[k]>n)
    22             break;
    23         temp*=prime[k];
    24         getantiprime(temp,k+1,sum*(i+1),i);
    25     }
    26 }
    27 int main()
    28 {
    29     scanf("%lld",&n);
    30     getantiprime(1,1,1,50);
    31     printf("%lld
    ",bestnum);
    32     return 0;
    33 }
    View Code
  • 相关阅读:
    FTP 协议和 HTTP 协议的比较
    HttpURLConnection的post请求,什么时候发出,writeData存在什么地方
    装饰器
    函数参数以及名称空间作用域
    函数的调用
    函数的返回值
    定义函数的三种方式
    函数
    day05
    day04
  • 原文地址:https://www.cnblogs.com/spactim/p/6622667.html
Copyright © 2020-2023  润新知