本题求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 }