题意
英文题真的杀千刀
真不好意思说我是某知名外国语学校的毕业生
已知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内,完全不虚啊。有时间再复习复习唯一分解定理吧。
代码
- #include<bits/stdc++.h>
- using namespace std;
- #define db double
- int p,q,r,s;
- db ans;
- int main()
- {
- while(scanf("%d%d%d%d",&p,&q,&r,&s)==4)
- {
- ans=1.0;
- q=min(q,p-q),s=min(s,r-s);
- for(int i=1;i<=q||i<=s;i++)
- {
- if(i<=q)ans=ans*(p-q+i)/i;
- if(i<=s)ans=ans/(r-s+i)*i;
- }
- printf("%.5lf\n",ans);
- }
- }
原文地址:https://www.cnblogs.com/NSD-email0820/p/9858943.html
时间: 2024-10-20 04:09:38