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