简、易-sachinKung

导航

PKU2992 Divisors

这道题 求Cn k所以因子的个数  

n=p1^k1*p2^k2*p3^k3……pm^km 因子的总个数 ans=(1+k1)*(1+k2)……(1+k(m-1))*(1+km);

这道题才431 很容易就想到打表,首先把n!所有质因子的指数求出来 !!这道题挺卡时间的,交了TLE后才过的!

#include<iostream>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

using namespace std;

const int maxn=433;

bool isp[maxn];

int prime[85];

struct Ft{

        int t[maxn];

}ft[maxn];

int t[maxn];

void getpri()

{

     int i,k,t;

     for(i=0;i<=maxn;i+=2)isp[i]=0;

     for(i=1;i<=maxn;i+=2)isp[i]=1;

     isp[1]=0;isp[2]=1;

     for(i=3;i<=maxn;i+=2)

        if(isp[i])

        {

            t=i+i;k=i+t;

            while(k<=maxn){isp[k]=0;k+=t;}           

        }

     prime[1]=2;k=1;

     for(i=3;i<=maxn;i+=2)

        if(isp[i])prime[++k]=i;

     prime[0]=k;

}

void factorize(int n,int *t)

{

    int i,s;

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

    {

        if(n%prime[i]==0)

        {

           s=0;

           while(n%prime[i]==0){s++;n/=prime[i];}

           t[prime[i]]=s;

           if(n==1)break;

           if(n/prime[i]<prime[i]){t[n]=1;n=1;break;}

        }

    }

    if(n>1)t[n]=1;

}

int main()

{

    getpri();

    int i,j,n,k;

    for(i=2;i<=431;i++)

    {

       factorize(i,ft[i].t);              

       for(j=1;j<=prime[0];j++)

       {

          ft[i].t[prime[j]]+=ft[i-1].t[prime[j]];

       }

    }

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

    {

          memset(t,0,sizeof(t));

          __int64 ans=1;

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

          {

              t[prime[i]]=ft[n].t[prime[i]]-ft[k].t[prime[i]]-ft[n-k].t[prime[i]];

              ans*=(1+t[prime[i]]);

          }

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

    }

    return 0;

}

posted on 2012-09-18 21:29  sachinKung  阅读(135)  评论(0)    收藏  举报