一个组合数的简单模板

用到了阶乘和阶乘逆元预处理(线性求逆元)

/*
组合数 C(n, m) 模板
lzh007  2020/6/1

****使用注意N的范围设定和模mod的范围设定***

*/

#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int NN = 1e5 + 17;//范围大小
const LL mod = 1e9 + 7;//模大小
LL f[NN], inv[NN], finv[NN];
//f存储阶乘,inv辅助求阶乘逆元,finv存阶乘逆元,所有值均已对模取余

//取模快速幂
LL km(LL base, LL b) {
	LL ans = 1;
	while (b > 0) {
		if (b & 1)
			ans = (ans * base) % mod;
		base = (base * base) % mod;
		b /= 2;
	}
	return ans;
}

//初始化f[NN], inv[NN], finv[NN]
void init() {
	f[0] = inv[0] = finv[0] = 1;
	f[1] = inv[1] = finv[1] = 1;
	for (LL i = 2; i < NN; i++) {
		f[i] = f[i - 1] * i % mod;
		inv[i] = (mod - mod / i) * inv[mod % i] % mod;
		finv[i] = (finv[i - 1] * inv[i]) % mod;
	}
}

//经过预处理后求C(n, m)
LL cnm(LL n, LL m) {
	return ((f[n] * finv[m] % mod) * finv[n - m]) % mod;
}

int main() {
	init();
	LL n, m;
	while (cin >> n >> m) {
		cout << "C(" << n << ', ' << m << ") 对 " << mod << " 取模的大小是 " << cnm(n, m) << endl;
	}
	return 0;
}

ps:小白一个,请多多指教

在 C# 窗体应用程序中编写一个简单计算器,可以分为以下几个步骤: 1. **创建新项目**:打开 Visual Studio,选择 "Windows Forms App (.NET Framework)" 作为模板,然后创建一个新的项目。 2. **设计界面**: - 添加一个 `MenuStrip` 用于显示菜单选项(如数字键、运算符等)。 - 添加一个 `TextBox` 作为输入框,用户将在这里输入计算表达式。 - 添加一组 `Button` 控件,对应数字0-9,以及加减乘除等运算符。 3. **添加事件处理**: - 对每个按钮关联适当的点击事件。例如,对于数字按钮,你可以存储当前的输入并处理连续按键;对于运算符按钮,你需要保存前一次输入的数,清除输入框,并等待下一个操作数。 4. **实现基本算法**: - 创建一个方法,比如 `DoCalculation`,接收两个操作数和一个运算符,根据运算符执行相应的计算。这里可以使用 `switch` 语句处理四种基本运算。 5. **组合操作**: - 在点击运算符按钮的事件处理程序中,先判断是否已有输入,若有则调用 `DoCalculation` 并将结果显示在输入框。如果没有输入,只更新当前的操作数。 6. **错误处理**: - 添加条件检查,比如除数为零的情况,避免程序崩溃。 7. **完成并测试**:记得设置一个 "Clear" 按钮清空输入框,一个 "Equal" 或 "Enter" 按钮触发最终计算结果。 ```csharp // 示例代码片段 private void ButtonAdd_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(txtInput.Text)) { double num = double.Parse(txtInput.Text); txtInput.Text = num.ToString(); currentNumber = num; } } private void ButtonDoCalculation_Click(object sender, EventArgs e) { if (currentNumber != null) { double secondNumber = double.Parse(txtInput.Text); // 根据实际运算符做相应计算... double result = DoCalculation(currentNumber, secondNumber, "operator you clicked"); txtInput.Text = result.ToString(); currentNumber = null; // 清理当前操作数 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值