恶补费马小定理和组合数

ops/2024/9/24 23:26:23/

前言:我们平时遇到的组合数如果用杨辉三角型做的话,预处理的复杂度是 n 2 n^2 n2 ,遇到大一点的数据就会爆炸

我们怎么去优化呢
C ( n , k ) = n ! k ! ⋅ ( n − k ) ! m o d mod C(n, k) = \frac{n!}{k! \cdot (n-k)!} \mod \text{mod} C(n,k)=k!(nk)!n!modmod
答案太大我们会进行取模,那么我们就可以利用费马小定理

在这里插入图片描述
所以我们可以对我们的分母乘积进行逆元操作
但是我们的阶乘进行预处理


我们再来看一下下面这个题目,分析我们得知,只有我们选取的 1 的个数是大于等于 k /2 +1 的,才是有价值的
所以我们可以用组合数的方法进行


题目地址
在这里插入图片描述


有一个易错点,我们预处理的时候,阶乘的 a[ 0 ] = 1 , 否则会出错


#include<bits/stdc++.h>
using namespace std;#define int long long
// 1 2 3
const int Mod = (int)1e9 + 7;
int n, k;
const int N = (int)2e5 + 5;
int a[N];void ini() {a[1] = 1; a[0] = 1;for (int i = 2; i < N; i++) {a[i] = (a[i - 1] * i) % Mod;}
}int qw(int x, int p) {int t = 1;while (p) {if (p & 1) t = (t * x) % Mod;x = (x * x) % Mod;p >>= 1;}return t;
}int C(int n, int k) {if (n < k) return 0LL;return (a[n] % Mod) * (qw(a[n - k] * a[k] % Mod, Mod - 2) % Mod) % Mod;
}signed main() {int t; ini();//for (int i = 1; i <= 10; i++) cout << a[i] << endl;//cout << qw(2, 2);cin >> t;while (t--) {cin >> n >> k;int one = 0;for (int i = 1; i <= n; i++) {int u; cin >> u;if (u) one++;} int ans = 0;for (int i = k / 2 + 1; i <= min(one, k); i++) {int t = C(one, i) * C(n - one, (k - i)) % Mod;ans = (ans + t) % Mod;}cout << ans << endl;}}

http://www.ppmy.cn/ops/93381.html

相关文章

Windows安装mmdet3d v0.17.1

背景 环境 windows 11家庭版&#xff0c; 64 位操作系统, 基于 x64 的处理器&#xff0c;显卡NVIDIA GeForce RTX 3060 需求 阅读一个3D目标检测源码&#xff0c;需要用到模块mmdetection3d v0.17.1&#xff0c;关于该模块的安装说明或教程几乎都是在Liunx环境下的&#x…

双胞胎命名有哪些特别之处?如何体现两者之间的联系与区别?

双胞胎命名艺术探秘 问题&#xff1a; 双胞胎命名有哪些特别之处&#xff1f;如何体现两者之间的联系与区别&#xff1f; 起尔网-免费取名|大师起名|宝宝起名|新生儿取名|男孩女孩在线起名姓名测试评分网起尔网-免费在线宝宝起名|新生儿取名|男孩女孩在线起名网&#xff0c;龙…

Java比较两个对象为什么要重写equals()和hashCode()

目录 1. 默认行为的局限性默认的 equals() 方法默认的 hashCode() 方法 2. 自定义逻辑相等性3. 集合操作的正确性和性能正确性性能 4. 遵循 Java 规范Kotlin 中的 data class 总结 在 Java 和 Kotlin 中&#xff0c;默认的 equals() 和 hashCode() 方法继承自 Object 类&#x…

C++11中的Lambda表达式

文章目录 C11中的Lambda表达式1.lambda表达式形式2.向lambda传递参数3.使用捕获列表4.lambda捕获和返回1.值捕获2.引用捕获3.隐式捕获4.可变lambda5.指定lambda的返回类型 C11中的Lambda表达式 1.lambda表达式形式 lambda表达式具有以下形式 [capture list] (parameter list)…

从零开始的CPP(36)——操作Excel

现有一个Excel A1.csv。 其表格第一列为&#xff1a;生物样本的名称&#xff1b;其他列为&#xff1a;生物样本的含量。表格第一行第一列是空格&#xff0c;第一行其他列为:受试者名称。 需求 如下&#xff1a;设计一个程序&#xff0c;可以指定受试者名称&#xff08;某列&…

千里江山图,自动化成诗:Expect脚本详解——从入门到进阶的自动化利器

目录 引言 Expect脚本基础 什么是Expect 基本语法 进阶应用 错误处理 正则表达式 并发处理 使用Shell脚本管理多个Expect脚本 在Expect脚本内部模拟并发 脚本复用与模块化 总结 引言 在自动化运维和测试领域&#xff0c;Expect脚本无疑是一把强大的利器。它以其灵…

深入解析 CentOS 中的 ifcfg-eth0 配置文件

深入解析 CentOS 中的 ifcfg-eth0 配置文件 1. 引言 在 CentOS 系统中&#xff0c;ifcfg-eth0 是网络接口配置文件的标准命名格式&#xff0c;其中 eth0 表示第一个以太网接口。正确配置这些文件对确保网络连接的稳定性和可靠性至关重要。本文将详细介绍 ifcfg-eth0 文件的所…

20240813 每日AI必读资讯

Flux生成网红博主因太逼真爆火&#xff01;有人用Claude写代码识破“AI美女” - Flux生成的情侣合照逼真程度达到恐怖级别&#xff0c;挑战人类视觉辨识能力。 - 网友发现Flux生成的照片几乎完美&#xff0c;但仍有细微瑕疵可供识别。 - 有人利用Flux等工具制作逼真的YouTub…