组合数学中的食用工具

背景:
教授在打概率和期望中的《灯蹬登》,需要推式子。众所周知,一个正确的式子不光要可以解释已有的数据,还要能预测未知数据的结果。在这样的情况下,组合数学的工具是必不可少的。我们通过这个工具实现了三种计算器无法直接实现的功能:

  1. 输入\(A,m,n\),表示求\(A^m_n\)的值
  2. 输入\(C,m,n\),表示求\(C^m_n\)的值
  3. 输入\(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);
		}
	}
}

打开即食,效果很好。

image

posted @ 2024-06-05 07:16  一位很会的教授er~  阅读(17)  评论(0编辑  收藏  举报