AcWing - 求组合数 II(预处理&逆元)
发布日期:2021-07-01 00:21:41
浏览次数:4
分类:技术文章
本文共 1081 字,大约阅读时间需要 3 分钟。
题目链接:
时/空限制:1s / 64MB题目描述
给定n组询问,每组询问给定两个整数a,b,请你输出的值。
输入格式
第一行包含整数n。
接下来n行,每行包含一组a和b。
输出格式
共n行,每行输出一个询问的解。
数据范围
1≤n≤10000,
1≤b≤a≤10^5
输入样例
3
3 1 5 3 2 2
输出样例
3
10 1
解题思路
题意:求出的值。
思路:范围小的话可以通过递推求出,否则就要先预处理。首先预处理出所有阶乘取模的余数fact[N],以及所有阶乘取模的逆元infact[N],如果取模的数是质数,可以用费马小定理求逆元。由,我们可以令,,则。
Accepted Code:
/* * @Author: lzyws739307453 * @Language: C++ */#includeusing 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月14日 21时27分47秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JPA案例
2019-05-01
dubbo学习笔记 十二 dubbo-cluster
2019-05-01
dubbo学习笔记 十三 dubbo-filter
2019-05-01
dubbo学习笔记 十一 dubbo-rpc之模块
2019-05-01
motan学习笔记 五 opentracing学习入门
2019-05-01
爬取博客园博客
2019-05-01
什么是Docker?
2019-05-01
一个基于百度云和图灵的人工智能程序
2019-05-01
用两个栈实现队列
2019-05-01
求列表最长子序列
2019-05-01
重建二叉树
2019-05-01
二进制中1的个数
2019-05-01
合并两个排序的链表
2019-05-01
二叉树的镜像
2019-05-01
树的子结构
2019-05-01
包含main函数的栈
2019-05-01
栈的压入、弹出序列
2019-05-01
顺时针打印矩阵
2019-05-01
从上往下打印二叉树
2019-05-01
二叉搜索树的后序遍历序列
2019-05-01