UVA 10375 选择与除法
一看四个整数的范围,<=10000 所以我们肯定不能直接打表求阶乘
利用唯一分解定理(任何一个大于1的正整数都能够被唯一地分解成质因子乘积)
#include<iostream> #include<string> #include<string> #include<string.h> #include<stdio.h> #include<queue> #include<math.h> #include<vector> #include<stdlib.h> #include<algorithm> #define maxn 10010 using namespace std; int primes[maxn],flag,t,e[maxn]; void add_integer(int n,int d){ for(int i=0;i<t;i++){ while(n%primes[i]==0){ n/=primes[i]; e[i]+=d; } if(n==1) break; } } void add_factorial(int n,int d){ for(int i=1;i<=n;i++){ add_integer(i,d); } } int main(){ int p,q,r,s; memset(primes,0,sizeof(primes)); t=1; primes[0]=2; for(int i=3;i<=maxn;i++){ flag=1; for(int k=2;k<=sqrt(i);k++){ if(i%k==0){ flag=0; break; } } if(flag){primes[t++]=i;} } while(cin>>p>>q>>r>>s){ memset(e,0,sizeof(e)); add_factorial(p,1); add_factorial(q,-1); add_factorial(p-q,-1); add_factorial(r,-1); add_factorial(s,1); add_factorial(r-s,1); double ans=1; for(int i=0;i<t;i++){ // cout<<primes[i]<<" "<<e[i]<<endl; ans*=pow(primes[i],e[i]); } printf("%.5lf\n",ans); } return 0; }