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 ;
}



posted @ 2012-02-03 00:33  Seraph2012  阅读(180)  评论(0编辑  收藏  举报