题目链接:https://vjudge.net/contest/156903#problem/E
题意:已知
求:C(p,q)/C(r,s)
其中p,q,r,s都是10^4,硬算是肯定超数据类型的。
可以这样处理:利用唯一分解式约分;
首先将所有数,唯一分解;最后,算素数的乘积;
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int maxn = 10000; 6 vector<int> primes; 7 int e[maxn]; 8 9 bool is_prime(int n) { 10 int m = floor(sqrt(n)+0.5); //向下取整 11 for(int i=2;i<=m;i++) 12 if(n%i==0) return false; 13 return true; 14 } 15 16 void add_integer(int n,int d) { 17 for(int i=0;i<primes.size();i++) { 18 while(n%primes[i]==0) { 19 n /=primes[i]; 20 e[i]+=d; 21 } 22 if(n==1) break; 23 } 24 } 25 26 void add_factorial(int n,int d) { 27 for(int i=1;i<=n;i++) 28 add_integer(i,d); 29 } 30 31 int main() 32 { 33 for(int i=2;i<=10000;i++) 34 if(is_prime(i)) primes.push_back(i); 35 36 int p,q,r,s; 37 while(cin>>p>>q>>r>>s) { 38 memset(e,0,sizeof(e)); 39 add_factorial(p,1); 40 add_factorial(q,-1); 41 add_factorial(p-q,-1); 42 add_factorial(r,-1); 43 add_factorial(s,1); 44 add_factorial(r-s,1); 45 46 double ans = 1; 47 for(int i=0;i<primes.size();i++) { 48 ans*=pow(primes[i],e[i]); 49 } 50 51 printf("%.5lf ",ans); 52 53 } 54 55 return 0; 56 }