• hdu 1141


    地址:http://acm.hdu.edu.cn/showproblem.php?pid=1141

    题意:atmel公司1960年发布4bits的处理器,每10年翻一番。给一个年份,问最近一次发布的处理器能运算的n!最大的n是多少。

    mark:最大的处理器位数是2160年的4194304bits。要算n!的二进制表示位,直接算很难,可以变成求log2后取整加1。然后因为log2(n!) = log2(1) + log2(2)...+log2(n),所以直接O(n)就可以了。大概算到30w可以把500wbits的算出来,之后按输入二分。

    代码:

    # include <stdio.h>
    # include <math.h>


    int dp[300010] ;


    void init()
    {
    int i ;
    double sum = 0 ;
    for (i = 2 ; i <= 300000 ; i++)
    {
    sum += log2(i*1.0) ;
    dp[i] = ((int)sum) + 1 ;
    }
    }


    int main ()
    {
    int n, l, r, mid ;
    init() ;
    while (~scanf ("%d", &n), n)
    {
    n = 1 << ((n-1940) / 10) ;
    l = 1, r = 300000 ;
    while (l<r-1)
    {
    mid = (l+r)/2 ;
    if (dp[mid] < n) l = mid ;
    else r = mid ;
    }
    if (dp[r] == n) l = r ;
    printf ("%d\n", l) ;
    }
    return 0 ;
    }



  • 相关阅读:
    06
    05
    继承
    0713作业
    0712作业
    0711作业
    福彩双色球作业
    0709作业
    选择语句+循环语句作业
    0706作业
  • 原文地址:https://www.cnblogs.com/lzsz1212/p/2336406.html
Copyright © 2020-2023  润新知