【朝夕的ACM笔记】数论 |
您所在的位置:网站首页 › 剁刀式切药机不适宜切制的药材是 › 【朝夕的ACM笔记】数论 |
【朝夕的ACM笔记】目录与索引逆元一、基本概念 当我们计算 a-b 时,可以将其视为 a+(-b) ;当我们计算 a/b 时,可以将其视为 a\times (1/b) ,也就是乘以其倒数。而逆元,可以理解为是在同余情况下的倒数。 简单来说,设 inv(b)为b\ mod\ m 意义下的逆元,则 a/b(mod\ m)=a\times inv(b)(mod\ m) 。 也就是说,在同余情况下,除去一个数,等于乘这个数的逆元。 由上面的式子可以推出 a/b(mod\ m)=a/b\times b\times inv(b)(mod\ m), 也就是说b\times inv(b)\equiv1(mod\ m) 。 需要注意,逆元仅在所求数与模数互质时存在。 乘法逆元有两个性质: ①在模特定数的情况下唯一,不存在多解。 ②乘法逆元是完全积性函数,也就是说 inv(a)\times inv(b)=inv(a\times b) 。 二、逆元求法2.1 费马小定理求法 费马小定理:若 a 与质数 p 互质,则 a^{p-1}\equiv1(mod\ p) 。由费马小定理可得, a\times a^{p-2}\equiv1(mod\ p) 。 也就是说,当模数为质数,且需要求逆元的数与模数互质时,可通过快速幂直接求取其逆元。 参考代码: long long quickpow(long long a,long long n) { a%=mod; long long res=1; while(n>0) { if(n&1) res=(res*a)%mod; a=(a*a)%mod; n>>=1; } return res; } long long inv(long long a) { return quickpow(a,mod-2); } 2.2 拓欧求法看到 b\times inv(b)\equiv1(mod\ m) 你是否有想到什么?这正是拓欧例题中的同余方程一题的题目。此式可化为 b\times inv(b)\equiv1(mod\ m) 也就是 b\times inv(b)+k\times m=1 。 当 b,m 不互质时,无解。 当其互质时,将二者代入拓欧就可以求解出一组可行解。 为防负数,最后做一步处理 inv(b)=(inv(b)\%m+m)\%m 。 参考代码: long long exgcd(long long a,long long b,long long &x,long long &y) { if(b==0) { x=1; y=0; return a; } long long ans=exgcd(b,a%b,x,y); long long temp=x; x=y; y=temp-a/b*y; return ans; } long long inv(long long a,long long p) { long long x,y; long long g=exgcd(a,p,x,y); if(g!=1) return -1;//不互质则无解 else return (x%p+p)%p; } 2.3 线性递推求法如果需要求一个大范围内所有数的逆元,再使用上面的方法会导致超时,所以还需要一种方法来线性求逆元。 我们设模数 m=k\times a+b 。 则可以化成同余式 k\times a+b\equiv0(mod\ m) 。 同余式两边同乘 inv(a)\times inv(b) ,得 k\times inv(b)+inv(a)\equiv0(mod\ m) 。 所以 inv(a)=-k\times inv(b)(mod\ m) 。 我们又由最开始对模数的定义式得到 k=m/a,b=m\%a 。 也就是说 inv(a)=-(m/a)\times(m\%a)(mod\ m) 。 观察上面的式子可以发现一个数的逆元可以由比它小的数的逆元递推而来。 所以就可以用于求范围内的逆元了。 线性求逆元的例题:【洛谷 P3811】 参考代码: int inv[1000000]; void find_inv(int last,int p)//求1~last所有数模p意义下的逆元 { inv[1]=1;//1的逆元就是1本身 for(int i=2;i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |