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;

}

 

你可能感兴趣的:(div)