AcWing - 求组合数 II(预处理&逆元)
发布日期:2021-07-01 00:21:41 浏览次数:4 分类:技术文章

本文共 1081 字,大约阅读时间需要 3 分钟。

题目链接:

时/空限制:1s / 64MB

题目描述

给定n组询问,每组询问给定两个整数a,b,请你输出C_{a}^{b}\ mod\ (10^9+7)的值。

输入格式

第一行包含整数n。

接下来n行,每行包含一组a和b。

输出格式

共n行,每行输出一个询问的解。

数据范围

1≤n≤10000,

1≤b≤a≤10^5

输入样例

3

3 1
5 3
2 2

输出样例

3

10
1

解题思路

题意:求出C_{a}^{b}\ mod\ (10^9+7)的值。

思路:范围小的话可以通过递推求出,否则就要先预处理。首先预处理出所有阶乘取模的余数fact[N],以及所有阶乘取模的逆元infact[N],如果取模的数是质数,可以用费马小定理求逆元。

C_{a}^{b}=\frac{a!}{b!*(a-b)!},我们可以令fact[i]=i!\ mod\ 10^9+7infact[i]=(i!)^{-1}\ mod\ 10^9+7,则C_a^b=fact[a] * infact[b] * infact[a - b]

Accepted Code:

/*  * @Author: lzyws739307453  * @Language: C++  */#include 
using namespace std;const int MAXN = 1e5, MAXM = 1e5 + 5;const int MOD = 1e9 + 7;int fact[MAXM], infact[MAXM];int Fast_Power(int a, int b, int p) { int res = 1; while (b) { if (b & 1) res = 1ll * res * a % p; a = 1ll * a * a % p; b >>= 1; } return res;}void Com_Num(int n) { fact[0] = infact[0] = 1; for (int i = 1; i <= n; i++) { fact[i] = 1ll * fact[i - 1] * i % MOD; infact[i] = 1ll * infact[i - 1] * Fast_Power(i, MOD - 2, MOD) % MOD; }}int main() { int t; Com_Num(MAXN); scanf("%d", &t); while (t--) { int a, b; scanf("%d%d", &a, &b); printf("%lld\n", 1ll * fact[a] * infact[b] % MOD * infact[a - b] % MOD); } return 0;}

转载地址:https://lzyws739307453.blog.csdn.net/article/details/99707410 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:AcWing - 求组合数 III(lucas&逆元)
下一篇:AcWing - 求组合数 I(递推)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月14日 21时27分47秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章