//目录

Uva 10375 选择与除法 唯一分解定理

题目链接: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\n",ans);
52 
53     }
54 
55     return 0;
56 }
View Code

 

posted @ 2017-04-02 16:24  小草的大树梦  阅读(248)  评论(0编辑  收藏  举报