poj 2992 Divisors

本题求C (n,k)的因子个数,开始我也是分别求n!/m!*(n-m)!分母和分子的素因子个数,再求因子个数果断tle了。。。

看过大牛们的discuss后,发现要打表,加上公式 c(n,k)=c(n,k-1)*(n-k+1)/k;求因子个数公式

设 N= P1^x1 * P2^x2* …… * Pn^xn;

则N的因子个数M为 M=(x1+1) * (x2+1) * …… *(xn+1);

附ac代码: (ps:有些变量名不规整,请不要在意细节←_←)

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cmath>
 4 using namespace std;
 5 
 6 int sign[500];
 7 int pri[500];
 8 int tot;
 9 int map[500],map1[500];
10 long long c[500][500];
11 
12 void getpri (){
13 memset (sign,0,sizeof sign);
14 tot=0;
15 sign[0]=sign[1]=1;
16 for (int i=2;i*i<500;i++){
17 if (!sign[i]){
18 for (int j=i*i;j<500;j+=i){
19 sign[j]=1;
20 }
21 }
22 }
23 for (int i=2;i<500;i++){
24 if (!sign[i]){
25 pri[tot++]=i;
26 }
27 }
28 }
29 
30 int main (){
31 int n,k;
32 long long ans,anss;
33 getpri ();
34 int nn=450;//long long ss[500][500];
35 for (int o=0;o<nn;o++){
36 c[o][0]=1;//ss[o][0]=1;
37 memset (map,0,sizeof map);
38 int f=0;
39 for (int i=1;i<=o/2;i++){//ss[o][i]=1;
40 memset (map1,0,sizeof map1);
41 int temp=o-i+1;
42 for (int j=0;pri[j]<=temp;j++){
43 while (temp%pri[j]==0){
44 temp/=pri[j];
45 map[j]++;
46 }
47 f=max (f,j);
48 }
49 temp=i;
50 for (int j=0;pri[j]<=temp;j++){
51 while (temp%pri[j]==0){
52 temp/=pri[j];
53 map1[j]++;
54 }
55 f=max (f,j);
56 }
57 ans=1;
58 for (int j=0;j<=f;j++){
59 map[j]-=map1[j];
60 map1[j]=0;
61 if (map[j])
62 ans*=(map[j]+1);
63 }
64 c[o][i]=ans;
65 }
66 }
67 while (cin>>n>>k){
68 k=min (k,n-k);
69 
70 
71 cout<<c[n][k]<<endl;
72 }
73 return 0;
74 }
原文地址:https://www.cnblogs.com/gfc-g/p/3842473.html