UVA10375 Choose and divide prime factor decomposition, uva10375divide
Prime factor decomposition:
Choose and divide
| Time Limit:3000 MS |
|
Memory Limit:Unknown |
|
64bit IO Format:% Lld & % llu |
Submit Status Description Problem D: Choose and divideThe binomial coefficientC (m, n)Is defined m!C(m,n) = -------- n!(m-n)! Given four natural numbersP,Q,R, AndS, Compute the result of dividingC (p, q)ByC (r, s). The InputInput consists of a sequence of lines. Each line contains four non-negative integer numbers giving valuesP,Q,R, AndS, Respectively, separated by a single space. All the numbers will be smaller than 10,000P> = qAndR> = s. The OutputFor each line of input, print a single line containing a real number with 5 digits of precision in the fraction, giving the number as described above. you may assume the result is not greater than 100,000,000. sample Input10 5 14 993 45 84 59145 95 143 92995 487 996 4882000 1000 1999 9999998 4999 9996 4998 Output for Sample Input0.12587505606.460551.282230.489962.000003.99960 Source Root: aoapc ii: Beginning Algorithm Contests (Second Edition) (Rujia Liu): Chapter 10. Maths: Examples Root: aoapc I: Beginning Algorithm Contests (Rujia Liu): Volume 6. Mathematical Concepts and Methods Root: Competitive Programming 2: This increases the lower bound of Programming Contests. Again (Steven & Felix Halim): Mathematics: Combinatorics: Binomial Coefficients Root: Competitive Programming 3: The New Lower Bound of Programming Contests (Steven & Felix Halim): Mathematics: Combinatorics: Binomial Coefficients
Root: Competitive Programming: Increasing the Lower Bound of Programming Contests (Steven & Felix Halim): Chapter 5. Mathematics: Combinatorics Root: Prominent Problemsetters: Gordon V. CormackSubmit Status |
|
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int maxn=10010;int p,q,r,s;int prime[maxn],pn;long long int fnum[maxn],pnum[maxn];bool vis[maxn];void pre_init(){ memset(vis,true,sizeof(vis)); for(int i=2; i<maxn; i++) { if(i%2==0&&i!=2) continue; if(vis[i]==true) { prime[pn++]=i; for(int j=2*i; j<maxn; j+=i) { vis[j]=false; } } }}void fenjie_x(int x,long long int* arr){ for(int i=0; i<pn&&x!=1; i++) { while(x%prime[i]==0) { arr[i]++; x/=prime[i]; } }}void fenjie(int x,long long int* arr){ for(int i=2; i<=x; i++) fenjie_x(i,arr);}void jianshao(){ for(int i=0; i<pn; i++) { long long int Min=min(fnum[i],pnum[i]); fnum[i]-=Min; pnum[i]-=Min; }}int main(){ pre_init(); while(scanf("%d%d%d%d",&p,&q,&r,&s)!=EOF) { memset(pnum,0,sizeof(pnum)); memset(fnum,0,sizeof(fnum)); fenjie(p,pnum);fenjie(s,pnum);fenjie(r-s,pnum); fenjie(q,fnum);fenjie(r,fnum);fenjie(p-q,fnum); jianshao(); double ans=1.; for(int i=0; i<pn; i++) { while(pnum[i]--) { ans*=1.*prime[i]; } while(fnum[i]--) { ans/=1.*prime[i]; } } printf("%.5lf\n",ans); } return 0;}