阶乘逆元线推(巩固+优化)

有时候在计算组合数的时候会经常用n!的逆元,如果n<=1e5左右的话,其实可以O(n)预处理出来的,当然一般MOD是1e9+7

代码也不难写:

Fac[0] = 1;
for (int i = 1; i <= N; i++) Fac[i] = (Fac[i-1] * i) % MOD;
Inv[N] = pow_mod(Fac[N], MOD-2);//Fac[N]^{MOD-2}
for (int i = N - 1; i >= 0; i--) Inv[i] = Inv[i+1] * (i + 1) % MOD;

然后在使用的时候是直接return Fac[N]*Inv[M]%MOD*Inv[N-M]%MOD;//计算C(N, M),注意不要溢出

如果MOD比N要小的话要注意了,因为如果Inv[i+1] = 0的话会导致推到前面都是0了,另外虽然没有深究过,但是觉得在这种情况下这个效果不是非常好,

所以这种预处理就暂时只用在MOD是1e9+7 或 1e9+9上。(就本人)

时间: 2024-11-13 10:14:15

阶乘逆元线推(巩固+优化)的相关文章

矩阵乘法递推的优化艺术

对于一个线性递推式,求它第项的值,通常的做法是先构造一个的矩阵,然后在时间内求出. 其实,由于这个矩阵的特殊性,可以将时间优化到.接下来我会以一个题目来讲解矩阵乘法递推的优化. 题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1229 题意:设,求的值.其中,和 . 前言:本题如果用普通的矩阵做法,很明显会TLE.那么我们要对这个特殊的矩阵进行时间上的优化. 分析:本题主要可用两种方法解决,分别是错位相减和矩阵乘法

拓展欧几里得求逆元与阶乘逆元求法

目录 什么是逆元 如何求逆元 阶乘逆元 本文章内,若无特殊说明,数字指的是整数,除法指的是整除. 什么是逆元 我们称\(a\)是\(b\)在模\(p\)情况下的逆元,则有\(a \times b \equiv 1 ( mod\,\,p)\). 所以呢,我们其实可以将逆元看成一个数的相反数.所以在除以一个数的时候,就相当于乘上它的相反数. 如何求逆元 我们先来看看什么情况下有逆元. 当且仅当\(gcd(b,p)=1\)时,\(b\)在模\(p\)情况下有逆元. 这个结论可由裴蜀定理显然推得,下面一

Nginx、Tomcat线上环境优化配置

 Nginx.Tomcat线上环境优化配置 Nginx优化: Nginx安全方面的优化: 1. nginx安全优化,在nginx配置文件http标签段内添加"server_tokens  off"即可隐藏访问或者报错时提示web版本号信息. 2. server_tokens参数可以在http,server,location的位置添加 3. 还可以修改nginx的3个源码文件 4. 如还需要安全优化更改端口.用户. nginx 性能优化: 对于nginx配置文件中对优化比较有作用的一般为

HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)

题解见X姐的论文 矩阵乘法递推的优化,只是mark一下.. HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)

uva 11174 - Stand in a Line(逆元+递推)

题目连接:uva 11174 - Stand in a Line 题目大意:村子里有n个村名民,现在他们要排成一列,处于对长辈的尊敬,他们不能排在自己父亲的前面,有些人的父亲不一定在村子了.问有多少种列的顺序. 解题思路:[算法竞赛入门经典-训练指南]的例题,主要还用到了欧几里得拓展定理求逆元. #include <cstdio> #include <cstring> #include <vector> using namespace std; typedef long

线上SQL优化

最近在线上发现很多性能有问题的sql,开发写sql语句的时候,没充分考虑是否用上索引了,所以这个坑得DBA来填,好了,废话不多说,把一些线上的优化经验跟大家分享. 由于是线上的表,所以就不公开具体的表结构了,请大家体谅,我会模拟一个类似的表来说明当时的性能问题: 当时的表结构类似此表: mysql> show create table test\G *************************** 1. row *************************** Table: test

【BZOJ3823】【East!模拟赛_Round5T1】定情信物 推公式+线性筛逆元(推公式法比出题人简)

题解1: 我们定义点为0维元素.线为1维元素.面为2维元素-- 既然一个低维超方体在对应新轴上平移得到高一维的超方体,比如二维超方体为一个面,然后沿新出现的z轴拓展,那么一个低维元素就会增加一维变成高一维的元素,比如点变成线.线变成面.面变成体-- 这样就有一个推式: 高维元素会由第一维的元素衍生.同维元素复制保留, 也就是一个超方体升维之后,高维超方体第i维元素的数量将是原超方体第i维的数量*2+(i-1)维的数量. 然后经过鬼畜的推导/撞大运的找规律,可以得到一个组合数公式, 最后加个线性筛

阶乘和阶乘逆元

扫盲.今天做题才知道这玩意..(那你之前是怎么算阶乘的哇..只会暴力暴力暴力嘛....) 1 #include<cstdio> 2 typedef long long LL; 3 const LL MOD = 1e9 + 7; 4 LL fac[1000000+5]; //阶乘 5 LL inv[1000000+5]; //逆元 6 7 LL quickMod(LL a,LL b) 8 { 9 LL ans = 1; 10 while (b) 11 { 12 if (b&1) 13 a

LeetCode 70 - 爬楼梯 - [递推+滚动优化]

假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2输出: 2解释: 有两种方法可以爬到楼顶.1. 1 阶 + 1 阶2. 2 阶 示例 2: 输入: 3输出: 3解释: 有三种方法可以爬到楼顶.1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶 设 $f[n]$ 表示跳上 $n$ 级台阶的方案数目,因此很容易得到 $f[n] = f[n-1