您的位置:首页 > 其它

POJ 2992 Divisors

2012-08-31 21:35 260 查看
题目大意:找出排列数的因子的个数

思路:排列数通过阶乘求得,所以也就是求阶乘的因子的个数,而因子的个数就是等于:(p1的次方+1)*(p2的次方+1)*(p3的次方+1)……在这里,pi是素数因子,之所以是加1就是当次方为0的时候也要考虑进去,还有这是求n的因子数,那么就是素数因子组合成n的各种组合,所以就要用到乘法定理,把这几个"步骤"“连起来”!

问题就转化到怎样求阶乘的所包含的素因子的相应次方数呢!

哈哈,重点来了,我的一篇博客就重点解说这个问题(定理法解决问题):先看看我这篇博客应该有所帮助:http://blog.csdn.net/kg_second/article/details/7929637

program:

#include<iostream>

#include<stdio.h>

#include<string.h>

#include<math.h>

#include<time.h>

using namespace std;

int prime[90]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,

157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317

,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439};

__int64 p[90];

__int64 col(int n,int i)

{

   __int64 sum=0;

   int p=i;

   while(n/i)

   {

                                     //cout<<"n/i   "<<n/i<<endl;

     sum+=n/i;

     i*=p;                        //i*=i is wrong        

   }

   return sum;      

}

int main()

{

int n,k;

while(scanf("%d%d",&n,&k)!=EOF)

{

   memset(p,0,sizeof(p));

   for(int i=1;prime[i]<=n;i++)

   { 

     

      p[i]+=col(n,prime[i]);

                                                 //cout<<"    1   i "<<i<<' '<<p[i]<<endl;    

   }

   for(int i=1;prime[i]<=k;i++)/////

   {

      p[i]-=col(k,prime[i]);

                                               //cout<<"    2   i  "<<i<<' '<<p[i]<<endl;    

   }

   for(int i=1;prime[i]<=n-k;i++)/////

   {

      p[i]-=col(n-k,prime[i]);

                                                   //cout<<"    3   i  "<<i<<' '<<p[i]<<endl;   

   }

   __int64 cnt=1;    

  for(int i=1;i<=85;i++)

     if(p[i]!=0)

         cnt=cnt*(p[i]+1);

  printf("%I64d\n",cnt);                

}

//system("pause");

return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: