扩展中国剩余定理
一般的中国剩余定理只能解决模数互质的情况。扩展中国剩余定理可以解决模数不互质的情况。
考虑依次将nnn个方程合并起来。设前面合并起来的方程是x=muku+aux=m_uk_u+a_ux=muku+au,当前枚举到的方程是x=mvkv+avx=m_vk_v+a_vx=mvkv+av,则联立得到(xxx的符号可忽略)muku+mvkv=au−avm_uk_u+m_vk_v=a_u-a_vmuku+mvkv=au−av
使用扩展欧几里得,求出最小正整数解ku′k_u'ku′和kv′k_v'kv′。那么我们合并得到的方程就是x=lcm(mu,mv)k+muku′+aux=\rm lcm(m_u,m_v)k+m_uk_u'+a_ux=lcm(mu,mv)k+muku′+au
这样合并到最后就能得到答案。
long long cm = m[0], ca =a[0];
for(int i = 1; i < n; i++) {
long long d, x, y, dela = (a[i]-ca%m[i]+m[i])%m[i];
exgcd(cm, m[i], d, x, y);
if(dela % d) {
printf("You've got no electricity, I come to your house!\n");
return 0;
}
long long sol = qmul(x, dela/d, m[i]/d);
ca += sol * cm;
cm *= m[i] / d;
ca = (ca%cm+cm)%cm;
}
return ca;
//2019.3.14 // mod = 苯酚醛
20180929UPD:由m1k1=a2−a1+m2k2m_1k_1=a_2-a_1+m_2k_2m1k1=a2−a1+m2k2
两边同时除以gcd(m1,m2)\gcd(m_1,m_2)gcd(m1,m2),令其为GGG(注意判断是否a2−a1∣Ga_2-a_1|Ga2−a1∣G,不成立则方程无解)。令A=a2−a1GA=\frac{a_2-a_1}{G}A=Ga2−a1。
m1Gk1=A+m2Gk2\frac{m_1}{G}k_1=A+\frac{m_2}{G}k_2Gm1k1=A+Gm2k2
m1Gk1=A(modm2G)\frac{m_1}{G}k_1=A \pmod{\frac{m_2}{G}}Gm1k1=A(modGm2)
k1=A⋅inv(m1G,m2G)(modm2G)k_1=A \cdot inv(\frac{m_1}{G},\frac{m_2}{G})\pmod{\frac{m_2}{G}}k1=A⋅inv(Gm1,Gm2)(modGm2)
k1=A⋅inv(m1G,m2G)+m2G⋅k′k_1=A \cdot inv(\frac{m_1}{G},\frac{m_2}{G})+\frac{m_2}{G}\cdot k'k1=A⋅inv(Gm1,Gm2)+Gm2⋅k′
最后将k1k_1k1代为x−a1m1\frac{x-a_1}{m_1}m1x−a1
x=A⋅inv(m1G,m2G)⋅m1+a1(modm1m2G)x=A\cdot inv(\frac{m_1}{G},\frac{m_2}{G})\cdot m_1+a_1 \pmod{\frac{m_1m_2}{G}}x=A⋅inv(Gm1,Gm2)⋅m1+a1(modGm1m2)
这就是合并后的方程。
扩展Lucas定理
Lucas定理只能解决模数是质数的情况。事实上很多扩展定理都是将质数推广到非质数而来的。扩展Lucas定理可以解决模数为任意正整数的问题,复杂度为O(pt)O(p^t)O(pt),其中ptp^tpt是模数分解为的质因数的幂。
首先学习求n!mod  ptn!\mod p^tn!modpt。将乘数中将ppp的倍数提出来,除以倍数后依然是阶乘形式,因此这一部分可以递归计算。而其它部分按值域每(p−1)pt−1(p-1)p^{t-1}(p−1)pt−1分为一组,它们对mod  pt\mod p^tmodpt是同余的,因此计算一组即可,复杂度O(pt)O(p^t)O(pt)。
举例说明,模数为32时,3^2时,32时,25!≡38×8!×(1×2×4×5×7×8)3×2525!\equiv3^8\times 8!\times (1\times2\times4\times5\times7\times8)^3\times 2525!≡38×8!×(1×2×4×5×7×8)3×25。
然后就可以计算Cnmmod  ptC_n^m\mod p^tCnmmodpt了。
回到原问题,我们将模数质因数分解为∏piti\prod p_i^{t_i}∏piti,设答案为ansansans,则我们得到若干个同余方程ans≡Cnm(mod  piti)ans\equiv C_n^m(\mod p_i^{t_i})ans≡Cnm(modpiti)。使用上述方法算出系数,然后中国剩余定理合并即可。
扩展BSGS
求ax≡b(mod  m)a^x\equiv b(\mod m)ax≡b(modm),mmm为任意正整数。
因为要求a−1mod  ma^{-1}\mod ma−1modm,所以在gcd(a,m)=1\gcd(a,m)=1gcd(a,m)=1时才能用BSGS解。考虑转化成这个形式。
原方程化为ax−1agcd(a,m)≡bgcd(a,m)(mod  mgcd(a,m))a^{x-1}\frac{a}{\gcd(a,m)}\equiv \frac{b}{\gcd(a,m)}(\mod \frac{m}{\gcd(a,m)})ax−1gcd(a,m)a≡gcd(a,m)b(modgcd(a,m)m)。将agcd(a,m)\frac{a}{\gcd(a,m)}gcd(a,m)a等看作系数,递归计算直到gcd(a,m)=1\gcd(a,m)=1gcd(a,m)=1。然后反带回去即可。答案=x+递归次数=x+递归次数=x+递归次数。
upd on 2019.1.13
设d=gcd(a,p)d=\gcd(a,p)d=gcd(a,p),则当d∣pd|pd∣p时有解。每次ppp会除以一个数,因此最多递归O(logp)O(\log p)O(logp)次。每次aaa的次数会减少111,因此最后求出的是x−递归次数x-递归次数x−递归次数。注意答案有可能小于递归次数,因此还要枚举小于等于递归次数的答案判断是否合法。
原根 指标
在模ppp意义下的原根ggg有以下性质:
原根个数=φ(φ(p))=\varphi(\varphi(p))=φ(φ(p));
gi≡gj(mod  p)⇔i≡j(mod  φ(p))g^i\equiv g^j(\mod p)\Leftrightarrow i\equiv j(\mod\varphi(p))gi≡gj(modp)⇔i≡j(modφ(p));
指标的定义:gind(x)≡xg^{ind(x)}\equiv xgind(x)≡x;
由此,xk(mod  p)x^k(\mod p)xk(modp)可转化为ind(x)⋅k(mod  φ(p))ind(x)\cdot k(\mod\varphi(p))ind(x)⋅k(modφ(p))。
求指标用BSGS,将指标还原用快速幂。
原根的求法
设模数为ppp,将φ(p)\varphi(p)φ(p)分解为∏Piti\prod P_i^{t_i}∏Piti。从222开始枚举ggg,如果有gφ(p)Pi≡1(mod  p)g^{\frac{\varphi(p)}{P_i}}\equiv1(\mod p)gPiφ(p)≡1(modp)满足则不是原根,否则找到一个原根。
如果广义黎曼猜想成立,ggg取到loglogloglogloglogn\log\log\log\log\log\log nloglogloglogloglogn规模时即可找到一个原根。由一个数的质因数个数是lognloglogn\frac{\log n}{\log \log n}loglognlogn,总复杂度为logn×loglogloglogloglognloglogn\frac{\log n\times\log\log\log\log\log\log n}{\log \log n}loglognlogn×loglogloglogloglogn,该算法的瓶颈在于分解质因数。
二次剩余
本季度内
from **999
已隐藏