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) 收藏 举报
浙公网安备 33010602011771号