TCO2012Round1A-2-EllysFractions


題目大意:
     對於分數A/B,如果滿足以下條件則稱該分數爲factor fraction。
  • A和B是互質的正整數
  • A*B是某個數的階乘
  • A小於B
     給定一個正整數N,求滿足A*B<=N!的所有factor fraction個數。
     
思路:
     
     由於限制條件1和2中的A和B都是具有對稱性的,可以暫時不考慮A小於B的限制條件,最終符合三個條件的factor fraction個數應該是放寬條件的個數的一半。
     利用動態規劃的思想,觀察符合A*B=(N-1)!的某個factor faction A/B,我們通過該factor faction來生成A'*B'=N!時的對應factor faction A'/B'。
  • 如果N不是一個質數,那麼N和(N-1)!必然具有相同的質因子,可以把N唯一地分解成兩個因子X和Y,使得X與A具有相同的質因子,Y與B具有相同的質因子。令A'=X*A, B'=Y*B, 則A' 和B'仍然互質。由於X和Y的生成具有唯一性,所以A/B可以唯一的映射到一個A'/B',並且不同的A/B肯定映射到不同的A'/B',而每一個A'/B'都可以找到一個這樣的映射關係。所以N!時的factor faction與(N-1)!時的factor faction具有完全映射的關係。
  • 如果N是一個質數,那麼N與A和B均互質,並且N不能再被分解。所以可以有兩種方案:A'=A*N, B'=B或A'=A, B'=b*N。
     根據以上觀察,定義一個函數f(n)表示n!對應的放寬條件的factor faction數,那麼有:
  • 如果n不是質數 : f(n) = f(n-1) 
  • 如果n是質數:f(n)=2*f(n-1)
     題目所求的答案爲:(f(1) + f(2) + ... + f(N))/2

Java代碼:
public class EllysFractions
{
    boolean prime( int n){
        if (n == 1){
            return false ;
        }
        for (int i = 2; i * i <= n; ++i){
            if (n % i == 0){
                return false ;
            }
        }
        return true ;
    }
       public long getCount( int N)
      {
          long res = 1;
             long count = 1;
             for (int i = 2; i <= N; ++i){
                if (prime(i)){
                    count = count * 2;
                }
                res += count;
            }
             return res / 2;
      }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章