【学时总结】◆学时·V◆ 逆元法
◆学时·V◆ 逆元法
□算法概述□
逆元运算是模运算中的一个技巧,一般用于解决模运算的除法问题。
模运算对于加、减、乘是有封闭性的,即 (a±b)%m=a%m±b%m,以及 (a×b)%m=a%m×b%m。但是对于除法运算不满足这样的规律。因此在处理两个大数相除的商模一个数会遇到困难。这时候需要逆元。
逆元的定义如下:
若 ab≡1 (mod m),则对于模m,a、b互为逆元
那么就有 b≡a-1。这就可以发挥作用了—— p/a%m=p*b%m,也就是除以一个数N再取模,等于乘上N的逆元再取模。
我们用 a-1 表示a的逆元。
□逆元的计算□
一眼望过去全是数学……
- 费马小定理
当p为质数且a不为p的倍数时,满足 ap-1≡1 (mod p),所以有 a*ap-2≡1,也就是说 a、ap-2 互为逆元。
很简单是不是,但别忘了这只是p是质数的时候才能用!OI中经常会出现“答案模(1e9+7)”,很幸运,(1e9+7)就是一个很有用的质数!
- 算法I
其实许多算法没有想象的这么难……
对于模数m,一定有整数(一般定义是正整数)a、p、r 满足 m=pa+r ,可以看成“被除数=商*除数+余数”。
可以得到:ap+r≡0(mod m)→-ap≡r(mod m)→-pr-1≡a-1 ,也就是 商与 余数的逆元 的积 的相反数 是 除数的逆元。
当然大家都知道当 r=0 ,即 m被p整除时,r-1 是不成立的!
而这个算法最玄学的地方在与 余数是一定小于除数的。这意味着什么呢?
—— 你在递推计算除数的逆元时,应该已经把余数的逆元算出来了。
- 算法II
不要慌……下面是一个递归式:
n-1=(n-1)!·(n!)-1
首先是一个不需要解释的小式子 n·[(n-1)!/n!]≡1。就很容易得到n的逆元就是(n-1)!/n!,稍微换一下,(n-1)!*(n!)-1。
应该还有很多,一下子记不起来了 (`・ω・´)
□除了做题好像没有什么用了□
- 传送门 ¦ARC 059 C¦
- 【翻译】
给出一个矩阵,在它的左下角剪去一个矩阵(只是一个角,保证剩余图形不是一个矩形),从左上角开始,可以向下或向右移动一个单位。
求从左上角到右下角的路径方案总数,答案模(1e9+7) (没错,就是这个不可描述的质数)
- 【解析】
很容易得到从A(p,q)到B(m,n),则纵向移动 |n-q|,横向移动 |m-p| ,总共移动 |n-q|+|m-p| 。因此,如果我们把移动步骤表示为一个串,则一定有 |m-p| 个步骤是横向移动的。那么A到B的方案总数为 C(|m-p|,|m-p|+|n-q|)。
假设现在没有剪去角,则矩形(r,c)从左上到右下方案总数为 C(r+c,r) = A。
我们还可以算出从剪去矩阵内的点出发,到达右下角的方案数B,由于答案与这些方案是补集,所以全集A减去子集B就是答案了。
但是计算组合数时就遇到了困难,此时就需要逆元。可以用初始化直接解决,当然需要使用快速幂。(计算逆元的函数是Pre,快速幂函数是PowMod)
- 【源代码】
/*Lucky_Glass*/
#include<cstdio>
#include<algorithm>
using namespace std;
#define MO 1000000007
#define MAXN 200005
#define LL long long
LL inv[MAXN],s[MAXN];
int n;
LL PowMod(LL a,int b)
{
LL ret=;
while(b)
{
if(b&) ret=ret*a%MO;
a=a*a%MO;
b>>=;
}
return ret;
}
void Pre()
{
s[]=;
for(int i=; i<=n; i++)
s[i]=s[i-]*i%MO;
inv[]=;
inv[n]=PowMod(s[n],MO-);
for(int i=n-; i>; i--)
inv[i]=inv[i+]*(i+)%MO;
}
LL C(int a,int b){if(a<||b<) return ;return s[a]*inv[b]%MO*inv[a-b]%MO;}
int main()
{
int h,w,A,B;
scanf("%d%d%d%d",&h,&w,&A,&B);
n=h+w-;
Pre();
LL ans=C(h+w-,h-);
for(int i=; i<=B; i++)
{
ans-=C(h-A+i-,h-A-)*C(A-+w-i,A-)%MO;
ans=(ans%MO+MO)%MO;
}
printf("%lld\n",ans);
}
The End
Thanks for reading!
- Lucky_Glass
【学时总结】◆学时·V◆ 逆元法的更多相关文章
- MT【330】u,v,w法
已知$a^2+b^2+c^2=1$求$abc(a+b+c)$的最小值.(2018辽宁预赛解答压轴题) 不妨设$a+b+c=3u,ab+bc+ca=3v^2,abc=w^3$,令$u^2=tv^2$要求 ...
- Chat Group gym101775A(逆元,组合数)
传送门:Chat Group(gym101775A) 题意:一个宿舍中又n个人,最少k(k >= 3)个人就可以建一个讨论组,问最多可以建多少个不同的讨论组. 思路:求组合数的和,因为涉及除法取 ...
- springMVC文件上传与下载(六)
1..文件上传 在springmvc.xml中配置文件上传解析器 <!-- 上传图片配置实现类,id必须为这个 --> <bean id="multipartResolve ...
- 洛谷 - P2051 - 中国象棋 - 简单dp
https://www.luogu.org/problemnew/show/P2051 一点都不简单的简单dp. 还是从旧行转移到新行,而不是考虑新行从哪些旧行转移吧. #include<bit ...
- E20170516-gg
accelerator n. 加速器;油门 oscillator n. 振荡器; 振子; oscillate vt. 使振荡,使振动 vi. 持续周期性地摆动; frame n. 框架; 边 ...
- 如何使用和关闭onbeforeunload 默认的浏览器弹窗事件
Onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过 window.onunload来指定或者在<body>里指定.区别在于o ...
- OpenCASCADE Root-Finding Algorithm
OpenCASCADE Root-Finding Algorithm eryar@163.com Abstract. A root-finding algorithm is a numerical m ...
- 基本数据类型-列表_元组_字典_day4
一.列表(list)书写格式:[] #通过list类创建的 li = [1, 12, 9, ", 10, ],"庞麦郎"], "ales", True ...
- LeetCode17 Letter Combinations of a Phone Number
题意: Given a digit string, return all possible letter combinations that the number could represent. A ...
随机推荐
- spring boot基本认识
大家眼中的spring boot:https://www.zhihu.com/question/39483566-------------------------------------------- ...
- DEDE [field:global name=autoindex/] 按序列号递增
在用织梦仿站的时候,有些class样式是btn1.btn2这样的样式循环的,这个时候1.2可以用[field:global name=autoindex/ ] 循环得到,[field:global n ...
- 基础7 面向对象进阶与socket编程
1.静态方法(用得少)(解除某个函数跟类的关联,加了静态方法后,类便不能将类的参数传给静态方法函数了) class Dog(object): def __init__(self,name): @sta ...
- jquery的全选和多选操作
//全选产品 $('#checkAll').click(function() { $(this).prop('checked',!$(this).prop('checked')); if($(this ...
- Win7安装软件,装到microsoft.vc90.crt时卡住的解决办法
在安装某些程序的时候,可能会出现下列提示:an error occured during the installation of assembly ‘microsoft.vc90.crt,versio ...
- Java项目性能瓶颈分析及定位(八)——Java线程堆栈分析(五)
对于CPU而言,常见的瓶颈主要有两种:服务器的压力很小,但是CPU的利用率却很高,这样的性能瓶颈相对比较容易定位(好比我只是说了你一句,你就哭了,你的弱点立马就暴露出来了):给服务器施加的压力很大,但 ...
- 使用mongoDB时错误解决
接触mongodb遇到的错误,记录下来,后续遇到问题,会持续更新 为了让mongodb更直观,在windows使用了NoSQL Manager for MongoDB作为连接工具 1.在连接数据库时遇 ...
- OpenGL学习 Our First OpenGL Program
This shows you how to create the main window with the book’s application framework and how to render ...
- Aizu The Maximum Number of Customers
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_5_A The Maximum Number of Customers Ide ...
- 爬虫第一篇基本库的使用——urllib
在Python2中有urllib2和urllib3两个库来实现请求的发送,在Pyhon3中则统一为urllib. urilib包含以下4个模块 request:最基本的请求模块,可以用来实现请求的发送 ...