【UVA10375】选择与除法

题意

英文题真的杀千刀

真不好意思说我是某知名外国语学校的毕业生

已知C(m,n)=m! / (n!*(m-n!)),输入整数p,q,r,s(p>=q,r>=s,p,q,r,s<=10000),计算C(p,q)/C(r,s)。输出保证不超过10^8,保留5位小数

分析

网上怎么全是唯一分解定理?阶乘不就可以约分越掉一大堆吗,上面剩下p~p-q+1下面剩下q~1或者上面剩下p~p-(p-q)+1下面剩下(p-q)~1

选一个小的就直接一个一个除了累起来就好了吧?需要注意的是,求C(p,q)和 C(r,s)不能分开算会乘爆的。。

答案也保证了在1e8内,完全不虚啊。有时间再复习复习唯一分解定理吧。

代码

  1. #include<bits/stdc++.h>  
  2. using namespace std;  
  3. #define db double   
  4. int p,q,r,s;  
  5. db ans;  
  6. int main()  
  7. {  
  8.     while(scanf("%d%d%d%d",&p,&q,&r,&s)==4)  
  9.     {  
  10.         ans=1.0;  
  11.         q=min(q,p-q),s=min(s,r-s);  
  12.         for(int i=1;i<=q||i<=s;i++)  
  13.         {  
  14.             if(i<=q)ans=ans*(p-q+i)/i;  
  15.             if(i<=s)ans=ans/(r-s+i)*i;  
  16.         }  
  17.         printf("%.5lf ",ans);    
  18.     }  
  19. }  
原文地址:https://www.cnblogs.com/NSD-email0820/p/9858943.html