阶乘和阶乘逆元

扫盲。今天做题才知道这玩意。。(那你之前是怎么算阶乘的哇。。只会暴力暴力暴力嘛。。。。)

 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             ans = ans * a % MOD;
14         a = a*a % MOD;
15         b >>= 1;
16     }
17     return ans;
18 }
19
20 void getFac()
21 {
22     fac[0] = inv[0] = 1;
23     for (int i = 1 ; i <= 1000000 ; i++)
24     {
25         fac[i] = fac[i-1] * i % MOD;
26         inv[i] = quickMod(fac[i],MOD-2);        //表示i的阶乘的逆元
27     }
28 }
29 LL getC(LL n,LL m)        //C(n,m) = n!/((n-m)!*m!) % (1e9+7)
30 {
31     return fac[n] * inv[n-m] % MOD * inv[m] % MOD;
32 }
33 int main()
34 {
35     getFac();
36     int n,m;
37     while (~scanf ("%d %d",&n,&m))
38         printf ("%lld\n",getC((LL)n,(LL)m));
39     return 0;
40 }

原文地址:https://www.cnblogs.com/TYH-TYH/p/9441755.html

时间: 2024-11-14 00:32:50

阶乘和阶乘逆元的相关文章

for循环计算某个数的阶乘、阶乘和及其倒数的阶乘和

1 //4的阶乘 2 int jc = 4; //定义一个变量用来代表要计算的数值 3 long jd =1; //定义最终输出的阶乘 4 5 for(int i = 1; i <= jc;i++) //定义循环加一,从一开始不断计算,直到输入的数值为止 6 { 7 jd = jd * i; //开始进行乘法运算,并不断将前一个数的乘积赋给阶乘 8 } 9 System.out.println("阶乘为: "+jd); //输出阶乘 10 11 阶乘计算的加法形式 1 //4的阶

求阶乘及阶乘和

1 #求阶乘方法一 2 def f1(n) 3 if n == 1 4 return 1 5 else 6 return n * f1(n-1) 7 end 8 end 9 10 #求阶乘方法二 11 def f2(n) 12 i = 1 13 while n > 0 14 i *= n 15 n -= 1 16 end 17 return i 18 end 19 20 #求1到n的阶乘之和方法一 21 sum = 0 22 (1..43).each do | x | 23 sum = sum

什么是阶乘

阶乘是基斯顿·卡曼(Christian Kramp,1760-1826)于 1808 年发明的运算符号,是数学术语. 一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1.自然数n的阶乘写作n!.1808年,基斯顿·卡曼引进这个表示法. 亦即n!=1×2×3×...×n.阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n. 阶乘的计算方法 阶乘指从1乘以2乘以3乘以4一直乘到所要求的数. 例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是2

大数问题:求n的阶乘

题目:求100! 这看起来是一个非常简答的问题,递归解之毫无压力 int func(int n){ if(n <= 1) return 1; else return n*func(n-1); } 但你会发现,题目真的有这么简单吗,考虑整形数据越界没有? 这实际上是一个大数问题! 大数怎么表示呢,非常直接的.我们会想到用字符串来表示.但表示的过程中还得做阶乘运算.是不是想象的那么复杂呢? 事实上.用主要的乘法运算思想(从个位到高位逐位相乘,进位)来考虑,将暂时结果的每位与阶乘元素相乘.向高位进位.

一起talk C栗子吧(第三回:C语言实例--求阶乘)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C语言实例吧! 看官们,上一回中咱们说的是判断闰年的例子,这一回咱们说的例子是:求阶乘. 看官们,阶乘是数学中的一种运算,通常使用感叹号来表示阶乘.比如:3!表示3的阶乘.阶乘的定义是这 样的:正整数n=0时,n的阶段乘为1,n>0时,n的阶乘为n*(n-1)!. 看官们,我在程序中使用了两种方法来求阶乘.一种是递归方法,另外一种是循环方法.正文中就不写代 码了,详细的

【题解】阶乘因子

题目描述 桐桐刚刚学习了自然数N的阶乘:阶乘(N!)被定义成从1到N的所有整数的乘积,例如5!=5×4×3×2×1=120.随着数N的增大,N!增长的非常快,5!=120,10!=3628800.桐桐想到了一种方法来列举那么大的数:不是直接列出该数,而是按照顺序列举出该数中各个质数因子出现的次数.如825可描述为(0 1 2 0 1),意思是对825分解质因数,这些质数因子中有0个2,1个3,2个5,0个7,1个11.请你编一个程序,读入N值,帮助桐桐按顺序输出N!所包含的质数因子的个数. 输入

UVa 11174 (乘法逆元) Stand in a Line

题意: 有n个人排队,要求每个人不能排在自己父亲的前面(如果有的话),求所有的排队方案数模1e9+7的值. 分析: <训练指南>上分析得挺清楚的,把公式贴一下吧: 设f(i)为以i为根节点的子树的排列方法,s(i)表示以i为根的子树的节点总数. f(i) = f(c1)f(c2)...f(ck)×(s(i)-1)!/(s(c1)!s(c2)!...s(ck)!) 按照书上最开始举的例子,其实这个式子也不难理解,就是先给这些子树确定一下位置,即有重元素的全排列. 子树的位置确定好以后,然后再确定

逆元基本知识

逆元的用处,ans = (a/b) % mod; 但是ans != (a%mod) / (b %mod) 因此我们 可以把ans 转化为 ans = a * inv(b,mod) % mod inv(b,mod) 的含义为  b 对于 mod 的逆元 令 inv(b,mod) = x; 转化为同余方程就是 bx ≡ 1(% mod) 当 b 与 mod 互质的时候有两种方法求 inv(b,mod) 单个元素逆元 ①扩展欧几里得 解不定方程 bx + mody = 1 其中 x的值即为 inv(b

HDU-3240(卡特兰数+分解质因数后求逆元)

卡特兰数相关公式 : \(H_n = {C_{2n}^n \over n+1)}\) \(H_n = {(4n-2)\over n+1}\times H_{n-1}\) \(H_n = C_{2n}^n - C_{2n}^{n-1}\) $ H_n = \begin{cases} \sum_{i=1}^{n} H_{i-1} H_{n-i} & n \geq 2, n \in \mathbf{N_{+}}\ 1 & n = 0, 1 \end{cases} $ 因为 \(n\le 1000