Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 4769 | Accepted: 2263 |
Description
Amtel has announced that it will release a 128-bit computer chip by 2010, a 256-bit computer by 2020, and so on, continuing its strategy of doubling the word-size every ten years. (Amtel released a 64-bit computer in 2000, a 32-bit computer in 1990, a 16-bit computer in 1980, an 8-bit computer in 1970, and a 4-bit computer, its first, in 1960.)
Amtel will use a new benchmark - the Factstone - to advertise the vastly improved capacity of its new chips. The Factstone rating is defined to be the largest integer n such that n! can be represented as an unsigned integer in a computer word.
Given a year 1960 <= y <= 2160, what will be the Factstone rating of Amtel's most recently released chip?
Amtel will use a new benchmark - the Factstone - to advertise the vastly improved capacity of its new chips. The Factstone rating is defined to be the largest integer n such that n! can be represented as an unsigned integer in a computer word.
Given a year 1960 <= y <= 2160, what will be the Factstone rating of Amtel's most recently released chip?
Input
There are several test cases. For each test case, there is one line of input containing y. A line containing 0 follows the last test case.
Output
For each test case, output a line giving the Factstone rating.
Sample Input
1960 1981 0
Sample Output
3 8
Source
问题链接:POJ2661 HDU1141 ZOJ2545 UVA10916 Factstone Benchmark
问题简述:(略)
问题分析:
1960年,字长是4位,每10年翻一番,即y年的字长为k=pow(2,(y-1960)/10),而k位的无符号整数是pow(2,k)-1。n!要小于等于pow(2,k)-1。需要注意溢出和超时,故采用对数运算。对于n!<=pow(2,k)-1的两边取对数,long2(n!)=log(1)+log2(n-1)+...+log2(n)<k。
程序说明:(略)
题记:(略)
参考链接:(略)
AC的C++语言程序如下:
/* POJ2661 HDU1141 ZOJ2545 UVA10916 Factstone Benchmark */ #include <iostream> #include <stdio.h> #include <math.h> using namespace std; int main() { int y; while(~scanf("%d", &y) && y) { double k = pow(2, (y - 1960) / 10 + 2); double sum = 0; int cnt = 1; while(sum < k) { cnt++; sum += log(cnt) / log(2); } printf("%d\n", cnt - 1); } return 0; }