poj 2992 素数
题意:求C(a, b) 的约数个数。(a b<432)
分析:C(a, b) = a! / b! / (a-b)!
对于任意质数 p, n! 中有(n/p + n/p^2 + n/p^3 + ...)个质因子p。
对于任意数 num = p1^a1 * p2^a2 *... pn^an ,其约数个数为(a1+1)*(a2+1)...(an+1)。
int prime[100]={2,3,5,7...421,431,1000000}; /*int s[1000005]={0}; inline int cal(int n,int k){ int cnt=n/k; int sum=s[cnt]; while(sum>=k){ cnt++; sum/=k; } return cnt; }*/ long long c[433][433]; long long cal(int n,int k){//n!里因子k的次数 if(c[n][k]!=-1)return c[n][k]; int i = n; long long res = 0; while(i) { i/=k; res += i; } c[n][k] = res; return c[n][k]; } int main(){ memset(c,-1,sizeof c); //FOR(i,1,1000005) s[i]=s[i-1]+i; int a,b; while(~scanf("%d%d",&a,&b)){ long long ans=1; FOR(i,0,83){ int p=prime[i]; if(a<p)break; int c=cal(a,p)-cal(b,p)-cal(a-b,p); //if(c==0)continue; ans*=c+1; } printf("%I64d\n",ans); } return 0; }