zoukankan      html  css  js  c++  java
  • 反质数(Antiprimes)

    转载http://www.cnblogs.com/tiankonguse/archive/2012/07/29/2613877.html

    问题描述:

    对于任何正整数x,起约数的个数记做g(x).例如g(1)=1,g(6)=4.

    定义:如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数.

    现在给一个N,求出不超过N的最大的反素数.

    比如:输入1000 输出 840

    思维过程:

    求[1..N]中最大的反素数-->求约数最多的数(约数同样多取数值小的)

    简单证明:

    如果X是答案,但X不是约数最多的数,假设约数最多的数是Y,那么Y>X,否则不符合反质数的定义。

    那么很明显Y也是一个反质数,且Y比X大,那么答案应该是Y而不是X。

    如果求约数的个数 756=2^2*3^3*7^1

    (2+1)*(3+1)*(1+1)=24

    基于上述结论,给出算法:按照质因数大小递增顺序搜索每一个质因子,枚举每一个质因子

    为了剪枝:

    性质一:一个反素数的质因子必然是从2开始连续的质数.

    因为最多只需要10个素数构造:2,3,5,7,11,13,17,19,23,29

    性质二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....

     1 typedef __int64 INT;
     2 INT bestNum;   //约数最多的数
     3 INT bestSum;   //约数最多的数的约数个数
     4 const int M=1000; //反素数的个数 
     5 INT n=500000;//求n以内的所有的反素数
     6 INT rprim[M][2];
     7 //2*3*5*7*11*13*17>n,所以只需考虑到17即可
     8 INT prim[14]={2,3,5,7,11,13,17,19,23,29};  
     9 
    10 //当前走到num这个数,接着用第k个素数,num的约数个数为sum,
    11 //第k个素数的个数上限为limit
    12 void getNum(INT num,INT k,INT sum,INT limit)  {
    13      if(num>n)return;
    14     if(sum>bestSum){
    15         bestSum = sum;
    16         bestNum = num;
    17     }else if(sum == bestSum && num < bestNum){  //约数个数一样时,取小数
    18         bestNum = num;
    19     }
    20   
    21     for(INT i=1,p=1;i<=limit;i++){   //素数k取i个
    22         p*=prim[k];
    23         getNum(num*p,k+1,sum*(i+1),i);
    24     }
    25 }
    26 
    27 INT log2(INT n){   //求大于等于log2(n)的最小整数
    28     INT i = 0;
    29     INT p = 1;
    30     while(p<n){
    31         p*=2;
    32         i++;
    33     }
    34     return i;
    35 }
    36 
    37 
    38    // ans=getNum(1,0,1,log2(n));
    View Code
  • 相关阅读:
    Poj 1742 Coins(多重背包)
    Poj 2350 Above Average(精度控制)
    求二进制数中1的个数
    Poj 1659 Distance on Chessboard(国际象棋的走子规则)
    Poj 2411 Mondriaan's Dream(压缩矩阵DP)
    Poj 2136 Vertical Histogram(打印垂直直方图)
    Poj 1401 Factorial(计算N!尾数0的个数——质因数分解)
    poj 2390 Bank Interest(计算本利和)
    Poj 2533 Longest Ordered Subsequence(LIS)
    Poj 1887 Testing the CATCHER(LIS)
  • 原文地址:https://www.cnblogs.com/vb4896/p/3973586.html
Copyright © 2011-2022 走看看