0w1

Bangladesh OI 2016 National Round pB. Beautiful Factorial Game ( Math )

http://codeforces.com/gym/101212/attachments/download/5014/bangladesh-informatics-olympiad-2016-en.pdf
Dashboard - Bangladesh Informatics Olympiad 2016 - Codeforces

題意:
給 N, K,求 N! 整除 K ^ x 的最大 x 是多少。

資料規模:
For easy version: 1 ≤ n ≤ 10, 2 ≤ k ≤ 10. [20% of total score]
For harder version: 1 ≤ n ≤ 100000000, 2 ≤ k ≤ 100000000. [100% of total score]
TL: 1000 ms
ML: 256 MB

解法:
令 F( t ) = N ! 整除 t ^ x 的最大 x。
我們想知道的其實是 [ 1, N ] 中的,對 K 質因數分解為 p1^n1 * p2^n2 .. 後,min{ F( p ) / n1, for all p }
因為 [ 1, N ] 中 A 的倍數有 N / A 個,因此當 p 為質數,F( p ) = Sigma{ N / p ^ r, for all positive integers r }

時間 / 空間複雜度:
O( 2^9 ) / O( 9 )

void solve(){
  int T; cin >> T;
  for( int kase = 1; kase <= T; ++kase ){
    cout << "Case " << kase << ": ";
    int N, K; cin >> N >> K;
    vp pf;
    int _k = K;
    for( int i = 2; i * i <= K; ++i ){
      int cnt = 0;
      while( _k % i == 0 ){
        _k /= i;
        ++cnt;
      }
      if( cnt > 0 ){
        pf.emplace_back( i, cnt );
      }
    }
    if( _k > 1 ){
      pf.emplace_back( _k, 1 );
    }
    ll ans = INF;
    for( int i = 0; i < pf.size(); ++i ){
      ll cnt = 0;
      for( ll v = pf[ i ].first; v <= 1LL * N; v *= pf[ i ].first ){
        cnt += N / v;
      }
      upmin( ans, cnt / pf[ i ].second );
    }
    cout << ans << endl;
  }
}