zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Codevs 2296 仪仗队 2008年省队选拔赛山东
    Codevs 1535 封锁阳光大学
    Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
    Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
    Codevs 1684 垃圾陷阱
    洛谷 P1108 低价购买
    Vijos P1325桐桐的糖果计划
    Codevs 3289 花匠 2013年NOIP全国联赛提高组
    Codevs 2611 观光旅游(floyed最小环)
    C语言基础之彩色版C语言(内含linux)
  • 原文地址:https://www.cnblogs.com/spactim/p/6622667.html
Copyright © 2011-2022 走看看