1. 程式人生 > >Choose and divide UVA - 10375

Choose and divide UVA - 10375

cstring div n) define all inpu small you sample

Choose and divide UVA - 10375

The binomial coefficient C(m, n) is defined as C(m, n) = m! (m ? n)! n!

Given four natural numbers p, q, r, and s, compute the the result of dividing C(p, q) by C(r, s).

Input

Input consists of a sequence of lines. Each line contains four non-negative integer numbers giving values for p, q, r, and s,

respectively, separated by a single space. All the numbers will be smaller than 10,000 with p ≥ q and r ≥ s.

Output

For 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 Input

10 5 14 9

93 45 84 59

145 95 143 92

995 487 996 488

2000 1000 1999 999

9998 4999 9996 4998

Sample Output

0.12587

505606.46055

1.28223

0.48996

2.00000

3.99960

題解:劉汝佳p317

AC代碼:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
using
namespace std; const int maxn=10005; int e[maxn]; int prime[maxn]; bool is_prime[maxn]; int cnt=0; void sieve() { for(int i=0;i<maxn;i++) is_prime[i]=true; is_prime[0]=is_prime[1]=false; for(int i=2;i<maxn;i++) if(is_prime[i]) { prime[cnt++]=i; for(int j=2*i;j<maxn;j+=i) is_prime[j]=false; } } void add_integer(int n,int d) { for(int i=0;i<cnt;i++) { while(n%prime[i]==0) { n/=prime[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; sieve(); 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<cnt;i++) { ans*=pow(prime[i],e[i]); } printf("%.5lf\n",ans); } return 0; }

今天也是元氣滿滿的一天!good luck!

Choose and divide UVA - 10375