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



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