poj 2992 Divisors

这个题要用到欧拉函数;a1^p1*a2^p2*a3^p3……an^pn,那么他的因子就有(p1 +1)*(p2+1)*……*(pn+1);

View Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<cstring>
#include<vector>
using namespace std;
int prime[200],cnt=0,num[450][450]={0};
void Prime( )
{
   for( int i = 2 ; i <= 431 ; i ++ )
   {
      int j ;
      for( j = 2 ; j < i ; j ++ )
      {
            if( i % j ==0 )
            break;    
      }
      if( j == i )
      {
         prime[cnt++] = i;
      }
   }    
}
void Solve(  )
{
   for( int i = 1; i <=431 ; i++  )
   {
       int t = i;
       for( int j = 0; j < cnt ; j ++ )
       {
            if( prime[j] > t )  break;
            while( t % prime[j] == 0 )
            {
               num[i][prime[j]]++;
               t /= prime[j];    
            }        
       }        
   }
   for( int i = 2; i <= 431 ; i ++ )
   {
       for( int k = 0 ; k < cnt ; k ++ )
       {
          
          num[i][prime[k]] += num[i-1][prime[k]];    
       }        
   }
   
}
long long Res( int n , int k )
{
   long long ans = 1;
   for( int i = 0; i < cnt ; i ++ )
   {
       ans *= (num[n][prime[i]] -  ( num[k][prime[i]] + num[n-k][prime[i]] ) + 1);        
   }
   return ans;    
}
int main(  )
{
    int n,k;
    Prime();
    Solve();
    while( scanf( "%d %d",&n,&k )==2 )
    {
        printf( "%lld\n",Res( n , k ) );
    } 
    //system( "pause" );
    return 0;
}

 

posted @ 2012-07-15 08:42  wutaoKeen  阅读(146)  评论(0编辑  收藏  举报