n! 分解素因子  快速幂

 

ei=[N/pi^1]+ [N/pi^2]+ …… + [N/pi^n]  其中[]为取整

ei 为数 N!中pi 因子的个数;

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 using namespace std;
 7 
 8 const int maxn=10005;
 9 
10 int sign[maxn];
11 int pri[maxn];
12 int tot;
13 
14 void getpri (){
15     memset (sign,0,sizeof sign);
16     sign[0]=sign[1]=1;
17     for (int i=2;i<sqrt (maxn+0.5);i++)
18         if (!sign[i])
19             for (int j=i*i;j<maxn;j+=i)
20                 sign[j]=1;
21     tot=0;
22     for (int i=2;i<maxn;i++)
23         if (!sign[i])
24             pri[tot++]=i;
25 }
26 
27 int e[maxn];
28 
29 int power (int a,int b){
30     int ans=1;
31     while (b){
32         if (b&1)
33             ans*=a;
34         a*=a;
35         b>>=1;
36     }
37     return ans;
38 }
39 
40 int main (){
41     getpri ();//cout<<tot<<endl;
42     int p,q,r,s;
43     while (~scanf ("%d%d%d%d",&p,&q,&r,&s)/*cin>>p>>q>>r>>s*/){
44         memset (e,0,sizeof e);
45         int ma=max (p,r);
46         for (int i=0;i<tot;i++){
47             int temp=pri[i];
48             while (temp<=ma){
49                 e[i]+=p/temp+s/temp+(r-s)/temp;//if (i==0) cout<<ma<<" ";
50                 e[i]-=r/temp+q/temp+(p-q)/temp;
51                 temp*=pri[i];
52             }
53         }
54         double ans=1;
55         for (int i=0;i<tot;i++){
56             if (e[i]>=0)
57                 ans*=1.0*power (pri[i],e[i]);
58             else ans/=1.0*power (pri[i],-e[i]);//cout<<e[i]<<":"<<pri[i]<<"=";//<<ans<<" ";
59         }
60         printf ("%.5f\n",ans);
61     }
62     return 0;
63 }

 

posted on 2014-08-01 17:59  gfc  阅读(162)  评论(0编辑  收藏  举报