组合数学中的食用工具
背景:
教授在打概率和期望中的《灯蹬登》,需要推式子。众所周知,一个正确的式子不光要可以解释已有的数据,还要能预测未知数据的结果。在这样的情况下,组合数学的工具是必不可少的。我们通过这个工具实现了三种计算器无法直接实现的功能:
- 输入\(A,m,n\),表示求\(A^m_n\)的值
- 输入\(C,m,n\),表示求\(C^m_n\)的值
- 输入\(D,m,n\),表示求m/n的最简分数形式
注意数据范围,使用的是unsigned long long,有可能会带来一些问题。
代码:
#include<bits/stdc++.h>
using namespace std;
char in;
unsigned long long a,b,js[100001],cnt;
inline unsigned long long A(unsigned long long x,unsigned long long y)
{
while(cnt<=y)
{
cnt++;
js[cnt]=js[cnt-1]*cnt;
}
return js[y]/js[y-x];
}
inline unsigned long long C(unsigned long long x,unsigned long long y)
{
while(cnt<=y)
{
cnt++;
js[cnt]=js[cnt-1]*cnt;
}
return js[y]/js[y-x]/js[x];
}
int main()
{
js[0]=1;
while(1)
{
scanf("%c",&in);
if(in=='A')
{
scanf("%lld%lld",&a,&b);
printf("%lld\n",A(a,b));
}
if(in=='C')
{
scanf("%lld%lld",&a,&b);
printf("%lld\n",C(a,b));
}
if(in=='D')
{
scanf("%lld%lld",&a,&b);
unsigned long long c=__gcd(a,b);
printf("%lld/%lld\n",a/c,b/c);
}
}
}
打开即食,效果很好。