本 文 更 新 中 本文更新中 本文更新中
欧 拉 函 数 : 小 于 n 的 正 整 数 中 与 n 互 质 的 数 的 数 目 , φ ( 1 ) = 1 欧拉函数:小于n的正整数中与n互质的数的数目,\varphi(1)=1 欧拉函数:小于n的正整数中与n互质的数的数目,φ(1)=1,通式: φ ( x ) = x ∏ i = 1 n ( 1 − 1 p i ) \varphi(x)=x\displaystyle\prod^n_{i=1}\left(1-\frac{1}{p_i}\right) φ(x)=xi=1∏n(1−pi1)
x = p 1 a 1 ⋯ p n a n 为 x 的 标 准 分 解 x=p_1^{a_1}\cdots p_n^{a_n}为x的标准分解 x=p1a1⋯pnan为x的标准分解
#include
#define ll long long
const int MAX_N = 1e6 + 5;
ll phi[MAX_N];
bool isprime[MAX_N];
//欧拉筛法
void Euler()
{
for(int i = 1; i < MAX_N; ++i) phi[i] = i;
memset(isprime, true, sizeof(isprime));
isprime[0] = isprime[1] = false;
for (int i = 2;i <= MAX_N; ++i){
if (isprime[i])
for (int j = i; j <= MAX_N; j += i){
isprime[j] = false;
phi[j] -= phi[j] / i;
}
}
}
void Euler()
{
for (int i = 1; i < MAX_N; ++i) phi[i] = i;
for (int i = 2; i < MAX_N; ++i)
if (phi[i] == i)
for (int j = i; j < MAX_N; j+=i)
phi[j] = (i - 1) * phi[j] / i;
}
//单个欧拉函数值
ll phi(ll n)
{
ll ans = n;
for (ll i = 2; i * i <= x; ++i) {
if (x % i == 0) {
ans -= ans / i;
while (x % i == 0) x /= i;
}
}
if (x > 1) ans -= ans / x;
return ans;
}
T h e o r e m : 设 g c d ( a , m ) = 1 , 则 a φ ( m ) ≡ 1 ( m o d m ) {\bf Theorem: }设gcd(a,m)=1,则a^{\varphi(m)}\equiv1(mod\ m) Theorem:设gcd(a,m)=1,则aφ(m)≡1(mod m)
T h e o r e m : 设 p 是 素 数 , p ∤ a , 则 a p − 1 ≡ 1 ( m o d p ) {\bf Theorem:}设p是素数,p\nmid a,则a^{p-1}\equiv1(mod\ p) Theorem:设p是素数,p∤a,则ap−1≡1(mod p)
对 于 素 数 p , 任 取 跟 其 互 素 的 数 a , 有 a p − 1 ( m o d p ) = 1 所 以 任 取 b , 有 a b % p = a b % ( p − 1 ) ( % p ) 从 而 简 化 运 算 。 对于素数p,任取跟其互素的数a,有a^{p-1}(mod\ p)=1\\ 所以任取b,有a^b\%p=a^{b\%(p-1)}(\%p)从而简化运算。 对于素数p,任取跟其互素的数a,有ap−1(mod p)=1所以任取b,有ab%p=ab%(p−1)(%p)从而简化运算。
T h e o r e m : 设 p 是 素 数 , 则 ( p − 1 ) ! ≡ − 1 ( m o d p ) {\bf Theorem:}设p是素数,则\left(p-1\right)!\equiv-1(mod\ p) Theorem:设p是素数,则(p−1)!≡−1(mod p)
T h e o r e m : 对 于 两 两 互 质 的 m i , 同 余 方 程 组 { x ≡ r 1 ( m o d m 1 ) x ≡ r 2 ( m o d m 2 ) ⋮ x ≡ r n ( m o d m n ) 的 解 为 x ≡ ∑ i = 1 n r i M i M i ‘ ( m o d M ) , 其 中 M = ∏ i = 1 n m i , M i = M m i , M i ‘ ≡ M i − 1 ( m o d m i ) {\bf Theorem:}对于两两互质的m_i,同余方程组\begin{cases} x\equiv r_1\quad(mod\ m_1)\\ x\equiv r_2\quad(mod\ m_2)\\ \vdots\\ x\equiv r_n\quad(mod\ m_n) \end{cases}的解为\\ x\equiv\sum_{i=1}^nr_iM_iM_i^`(mod\ M),其中M=\prod_{i=1}^nm_i,M_i=\frac{M}{m_i},M_i^`\equiv M_i^{-1}\ (mod\ m_i) Theorem:对于两两互质的mi,同余方程组⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡r1(mod m1)x≡r2(mod m2)⋮x≡rn(mod mn)的解为x≡i=1∑nriMiMi‘(mod M),其中M=i=1∏nmi,Mi=miM,Mi‘≡Mi−1 (mod mi)
例 : 例: 例:POJ2891
#define ll long long
ll a[MAX_N], b[MAX_N];
void exgcd(ll a, ll b, ll &x, ll &y)
{
if(!b) x=1, y=0;
else {
exgcd(b, a % b, x, y);
y -= a / b * y;
}
}
ll crt()
{
ll ans = 0, lcm = 1, x, y;
for(ll i = 0; i < k; ++i) lcm *= b[i];
for(ll i = 0; i < k; ++i) {
ll t = lcm / b[i];
exgcd(t, b[i], x, y);
x = (x % b[i] + b[i]) % b[i];
ans = (ans + t * x * a[i]) % lcm;
}
return (ans + lcm) % lcm;
}
g c d ( a , b ) = g c d ( a , b − a ) = g c d ( a , b m o d a ) gcd(a,b)=gcd(a,b-a)=gcd(a,b\ mod\ a) gcd(a,b)=gcd(a,b−a)=gcd(a,b mod a)
a ⋅ b = g c d ( a , b ) ⋅ l c m ( a , b ) a\cdot b=gcd(a,b)\cdot lcm(a,b) a⋅b=gcd(a,b)⋅lcm(a,b)
扩 展 欧 几 里 得 算 法 ( 贝 祖 ( B e z o u t ) 定 理 ) : 存 在 整 数 下 x , y , 使 得 a x + b y = g c d ( a , b ) 扩展欧几里得算法\left(贝祖\left(Bezout\right)定理\right):存在整数下x,y,使得ax+by=gcd(a,b) 扩展欧几里得算法(贝祖(Bezout)定理):存在整数下x,y,使得ax+by=gcd(a,b)
b = 0 时 , g c d ( a , b ) = a , x = 1 , y = 0 , 否 则 a x 1 + b y 1 = g c d ( a , b ) , b x 2 + ( a m o d b ) y 2 = g c d ( b , a m o d b ) = g c d ( a , b ) a x 1 + b y 1 = a x 2 + ( a − [ a b ] b ) y 2 = a y 2 + b ( x 2 − [ a b ] y 2 ) 故 x 1 = y 2 , y 1 = x 2 − [ a b ] y 2 b=0时,gcd(a,b)=a,x=1,y=0,否则\\ax_1+by_1=gcd(a,b),\quad bx_2+(a\ mod\ b)y_2=gcd(b,a\ mod\ b)=gcd(a,b)\\ax_1+by_1=ax_2+(a-[\frac{a}{b}]b)y_2=ay_2+b(x_2-[\frac{a}{b}]y_2)\\故x_1=y_2,y_1=x_2-[\frac{a}{b}]y_2 b=0时,gcd(a,b)=a,x=1,y=0,否则ax1+by1=gcd(a,b),bx2+(a mod b)y2=gcd(b,a mod b)=gcd(a,b)ax1+by1=ax2+(a−[ba]b)y2=ay2+b(x2−[ba]y2)故x1=y2,y1=x2−[ba]y2
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) {
x = 1, y = 0;
return a;
}
else {
ll g = exgcd(b, a % b, y, x);
y -= a / b * x;
return g;
}
}
#define ll long long
//拓展欧几里得求逆元 o(logn)
void exgcd(ll a, ll b, ll &x, ll &y)
{
if(!b) x = 1, y = 0;
else {
exgcd(b, a % b, y, x);
y -= a / b * x;
}
}
ll inv(ll a, ll b)
{
ll x, y;
exgcd(a, b, x, y);
return (x + b) % b;
}
//费马小定理求逆元 o(logn)
ll qpow(ll a, ll n, ll p)
{
ll ans = 1;
for(; n; n >>= 1, a = a * a % p)
if(n & 1) ans = ans * a % p;
}
ll inv(ll a, ll b)
{
return qpow(a, b - 2, b);
}
例 : 例: 例:Luogu P2613
素 数 定 理 : lim n → ∞ π ( n ) n / ln n 素数定理:\displaystyle\lim_{n\to\infty}\frac{\pi(n)}{n/\ln n} 素数定理:n→∞limn/lnnπ(n)
#include
#include
#define ll long long
const int MAX_N = 1e5;//求MAX_N范围内的素数
ll prime[MAX_N], cnt;
bool isprime[MAX_N];
void sieve()
{
cnt = 1;
memset(isprime, true, sizeof(isprime));
isprime[0] = isprime[1] = false;
for (ll i = 2;i <= MAX_N; ++i) {
if (isprime[i]) {
prime[cnt++] = i;
for (ll j = 2 * i; j <= MAX_N; j += i)
isprime[j] = false;
}
}
}
int main()
{
sieve();
for (ll i = 1; i < cnt; ++i)
printf("%15d", prime[i]);
return 0;
}
const int MAX_N = 1e5;
int prime[MAX_N], cnt;
bool check[MAX_N];
void sieve(){
for (int i = 2;i <= MAX_N; ++i){
if(!check[i]) prime[++cnt] = i;
for (int j = 1; j <= cnt && prime[j] * i <= MAX_N; ++j) {
check[prime[j] * i] = true;
if(i % prime[j] == 0) break; //重点
}
}
}
#include
#define ll long long
ll qmul(ll a, ll b, ll p)
{
a %= p, b %= p;
ll ans = 0;
while(b) {
if(b & 1) ans = (ans + a) % p;
a = (a << 1) % p;
b >>= 1;
}
return ans;
}
ll qpow(ll a, ll n, ll p)
{
ll ans = 1;
for(; n; a = qmul(a, a, p), n >>= 1)
if(n & 1) ans = qmul(ans, a, p);
return ans;
}
bool miller_rabin(ll n)
{
if(n == 2) return true;
if(n < 2 || !(n & 1)) return false;
ll s = n - 1, t = 0, a, x, y;
while(!(s & 1)) {
s >>= 1;
t++;
}
for(int i = 0; i < 10; ++i) {
a = rand() % (n - 1) + 1;
x = qpow(a, s, n);
for(int j = 0; j < t; ++j) {
y = qmul(x, x, n);
if(y == 1 && x != 1 && x != n - 1) return false;
x = y;
}
if(x != 1) return false;
}
return true;
}