线性筛
枚举倍数
int p[N], f[N], idx;
void sieve(){n = read(), f[0] = f[1] = 1;for(int i = 2;i <= n;i++){if(!f[i]) p[++idx] = i;for(int j = 1;j <= idx && i*p[j] <= n;j++){f[i*p[j]] = 1;if(i%p[j] == 0) break;}}
}
快速幂
O(logn)求出\(a^b\)\(\%m\)
ll poww(ll x, ll y, ll m){ll ans = 1, base = x;while(y){if(y&1) ans *= base;base *= base;y >>= 1;ans %= m;base %= m;}return ans;
}
欧拉函数
\(\Phi(n)\) 即为从1~n的正整数与n互质的数的个数 通常用 \(phi[n]\) 表示
一些性质:
若 \(n\) 为质数,则 \(phi[n]\) = \(n-1\)
若 \(n = p^k\)(\(p\) 为质数,则 \(phi[n] = p^k - p^{k-1}\)
若 \(n\) 与 \(m\) 互质,则 \(phi[n\times m] = phi[n] \times phi[m]\) (积性函数)
若 \(n\) 为奇数,则 \(phi[2n] = phi[n]\)
关于欧拉函数积性函数的性质:
前置:\(p|n\) 指 \(n\) 能整除 \(p\),即 \(n\%p\) == 0
若 \(p|n\) 且 \(p^2|n\),则 \(phi[n] = phi[n/p]\times p\)
若 \(p|n\) 且 \(p^2!|n\),则 \(phi[n] = phi[n/p]\times (p-1)\)
\(\sum_{d|n}phi[d] = n\)
线性筛求1~n的欧拉函数:
for(int i = 2;i <= n;i++){if(!f[i]) p[++idx] = i, phi[i] = i-1;for(int j = 1;j <= idx && p[j]*i <= n;j++){f[i*p[j]] = 1;if(i%p[j] == 0){phi[i*p[j]] = p[j]*phi[i];break;}else phi[i*p[j]] = (p[j]-1)*phi[i];}
}
欧几里得算法(gcd)
快速求gcd,时间复杂度为\(O(logn)\)
int gcd(int x, int y){if(y) return gcd(y, x%y);return x;
}
扩展欧几里得算法(exgcd)
裴蜀定理:对于任意整数a,b 存在x,y 满足ax+by=gcd(a,b) x,y不止一组
推论:若ax+by=d有解,则gcd(a,b)|d。ax+by=1有解是a,b互质的充要条件
证明:
\(ax_1+by_1 = gcd(a,b)\)
\(bx_2+(a\%b)y_2 = gcd(b, a\%b)\)
又 \(gcd(a,b) = gcd(b,a\%b)\)
移项可得
\(x_1 = y_2\)
\(y_1 = x_2-(a/b)\times y\)
向下递归,当 \(b=0\),\(gcd(a,b) = a\),此时 \(x = 1, y = 0\),返回 \(gcd(a,b)\),通过递归,求出一组特解(\(x_0,y_0\))
时间复杂度同普通gcd,为 \(O(logn)\)
int exgcd(int a, int b, int &x, int &y){if(b == 0){x = 1, y = 0;return a;}int r = exgcd(b, a%b, x, y), t = x;x = y;y = t-(a/b)*y;return r;
}
exgcd求线性不定方程
对于\(ax+by = c\),根据裴蜀定理,若方程存在整数解,需要满足条件:\(gcd(a,b)|c\)。否则,无整数解。
exgcd求出的一组特解 \(x_0,y_0\),乘上系数 \(c/gcd(a,b)\),就从\(ax+by=gcd(a,b)\)的解转化到了\(ax+by=c\)的解,即 \(x_0\times c/gcd(a,b)\) 和 \(y_0\times c/gcd(a,b)\)。
再加减系数(其实化简后就是加减了\(a\times b/gcd(a,b)\times t\)),通解公式:
\(x = c/gcd(a,b)\times x_0+b/gcd(a,b)\times t\)
\(y = c/gcd(a,b)\times y_0-a/gcd(a,b)\times t\)
(\(t\in Z\))
int cal(int a, int b, int &x, int &y){int g = exgcd(a, b, x, y);if(c%g != 0) return 0;int k = c/g;x *= k, y *= k;//此为一组解 所有解为 x*k+b/k*t, y*k+a/k*t (t为整数)return 1;
}
同余
定义:两个整数\(x,y\),若他们除以正整数\(m\)的余数相等,则称\(x,y\)模\(m\)同余,记为 \(x\equiv y (mod m)\)
解线性同余方程:
给定整数\(a,b,m\),求一个整数\(x\)满足:\(ax\equiv b(mod m)\),或者判定无解。该方程等价于\(ax-b\)是\(m\)的整数倍,设为\(-y\)倍。
则:\(ax-b=m*(-y)\)。移向得:\(ax+my=b\)
这样就转化为了解线性不定方程,当\(gcd(a,m)|b\)时有解。
求出一组通解后,快速转化为最小整数解的方法:
设\(ans=b/gcd(a,m)*x_0\),\(s=m/gcd(a,m)\),则最小整数解为\(ans=(ans\%s+s)%s\)。
欧拉定理 费马小定理
乘法逆元
逆元定义:模意义下的倒数