土下座しながら探索中

主に競技プログラミング

POJ 2661 : Factstone Benchmark

問題リンク:2661 -- Factstone Benchmark

問題概要:
とある会社が1960年に4-bitコンピュータをリリースした
1970年には8-bit,1980年には16-bit,....
といった感じで、10年毎にbit数が2倍になっていく
ある年y( 1960 <= y <= 2160 ) が与えられるので、
その年のコンピュータがunsigned intで表現できるn!のnを求めよ

解法:
2^y >= n! となるような最大のnを求めたい
log2(n!) <= y と変形する
log2(a*b) = log2(a) + log2(b)なので
log2(1) + log2(2) + log2(3) + ....としていってyを越えたときの値-1が答えとなる

コード:

#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>

#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
#define EPS (1e-8)
#define equals(a,b) (fabs((a)-(b))<EPS)

using namespace std;

int main(){
  int year[21], bit[21];
  year[0] = 1960, bit[0] = 4;
  REP(i,1,21) {
    year[i] = year[i-1] + 10;
    bit[i] = bit[i-1] * 2;
  }
  int y;
  while( scanf("%d",&y), y ){
    int pos = lower_bound(year,year+20,y) - year;
    if( year[pos] > y ) pos--;
    double limit = bit[pos];
    int n = 0;
    double logn = 0;
    while( !equals(logn,limit) && logn < limit ){
      n++;
      logn += log2(n);
    }
    cout << n-1 << endl;
  }
  return 0;
}