ACM算法总结 数论(二)

目录

        • 原根
        • 质因数分解
        • 卢卡斯定理(Lucas)
        • 数论分块
        • 莫比乌斯反演
        • 杜教筛
        • 威尔逊定理



原根

( a , m ) = 1 (a,m)=1 (a,m)=1,使得 a x ≡ 1 ( m o d   m ) a^x \equiv 1(mod \ m) ax1(mod m) 成立的最小的 x x x,称为 a a a关于模 m m m,记为 o r d m a ord_ma ordma

  • o r d m a = x ord_ma=x ordma=x,则 o r d m a t = x ( t , x ) ord_ma^t=\frac{x}{(t,x)} ordmat=(t,x)x
  • o r d m a ∣ φ ( m ) ord_ma|\varphi(m) ordmaφ(m)

( g , m ) = 1 (g,m)=1 (g,m)=1,且 o r d m g = φ ( m ) ord_mg=\varphi(m) ordmg=φ(m),则 g g g m m m的一个原根

  • m m m有原根,则 m m m满足下述形式: 2 , 4 , p a , 2 p a 2,4,p^a,2p^a 2,4,pa,2pa,其中 p p p为奇素数, a a a为正整数;
  • g g g m m m的一个原根,则集合 S = { g s ∣ 1 ≤ s ≤ φ ( m ) , ( s , φ ( m ) ) = 1 } S=\{g^s|1\leq s\leq \varphi(m),(s,\varphi(m))=1\} S={gs1sφ(m),(s,φ(m))=1}构成 m m m的所有原根;
  • p 1 , p 2 , . . . , p k p_1,p_2,...,p_k p1,p2,...,pk φ ( m ) \varphi(m) φ(m)所有不同的质因子, ( g , m ) = 1 (g,m)=1 (g,m)=1,且对于任意 1 ≤ i ≤ k 1 \leq i \leq k 1ik,有 g φ ( m ) p i ≢ 1 ( m o d   m ) g^{\frac{\varphi(m)}{p_i}} \not\equiv 1(mod \ m) gpiφ(m)1(mod m) ,则 g g g m m m的原根。



质因数分解

质因数分解, p , k p,k p,k分别表示分解后的质因数和对应的幂。

void prime_fac(int x,VI &p,VI &k)
{
    for(int i=2;i*i<=x;i++)
        if(x%i==0)
        {
            p.push_back(i);
            int q=0;
            while(x%i==0) q++,x/=i;
            k.push_back(q);
        }
    if(x>1) p.push_back(x),k.push_back(1);
}



卢卡斯定理(Lucas)

p p p为素数,则 C n m % p = C n / p m / p ⋅ C n % p m % p % p C_n^m\%p=C_{n/p}^{m/p} \cdot C_{n\%p}^{m\%p} \%p Cnm%p=Cn/pm/pCn%pm%p%p 。常用于大数小模数的组合数计算。

LL lucas(LL n,LL m,LL p) //卢卡斯定理(p是素数)
{
    if(!m) return 1;
    return C(n%p,m%p)*lucas(n/p,m/p)%p;
}

扩展卢卡斯定理(exLucas)

对于 p p p不是素数的情况,首先进行质因数分解,然后对每一块分别求答案之后用CRT合并答案。

每一块虽然不一定是质数(是质数的幂),但是通过阶乘变形可以找到规律然后递归求解。

...(pit)



数论分块

用于求解 ∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^{n} \lfloor\frac{n}{i}\rfloor i=1nin

核心思想是对于任意的 i i i,找到最大的 j j j,使得 ⌊ n i ⌋ = ⌊ n j ⌋ \lfloor\frac{n}{i}\rfloor=\lfloor\frac{n}{j}\rfloor in=jn ,可以证明 j = ⌊ n ⌊ n i ⌋ ⌋ j=\lfloor\frac{n}{\lfloor\frac{n}{i}\rfloor}\rfloor j=inn 。所以可以在 O ( n ) O(\sqrt{n}) O(n ) 的时间内求解。

对于多个取整相乘同时分块的话(比如 ∑ i = 1 n ⌊ n i ⌋ ⌊ m i ⌋ \sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{i}\rfloor i=1ninim),显然每次的 j j j 就取最小那个。

int cal(int n)
{
    int ans=0;
    for(int l=1,r=0;l<=n;l=r+1)
    {
        r=n/(n/l);
        ans+=(r-l+1)*(n/l);
    }
    return ans;
}



莫比乌斯反演

莫比乌斯函数定义:
μ ( n ) = { 1 , n = 1 0 , n 有 平 方 因 子 ( − 1 ) k , k 为 n 的 质 因 子 个 数 \mu(n) = \left\{\begin{array}{lr} 1 ,& n=1 \\ 0 ,& n有平方因子\\ (-1)^k, & k为n的质因子个数 \end{array}\right. μ(n)=1,0,(1)k,n=1nkn
线性筛法:

int mu[maxn],prime[maxn],cnt;
bool book[maxn];

void get_mu(int n)
{
    mu[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!book[i]) prime[cnt++]=i,mu[i]=-1;
        for(int j=0;j

狄利克雷卷积:设 f ( n ) , g ( n ) f(n),g(n) f(n),g(n)为积性函数,则 f ∗ g = ∑ d ∣ n f ( d ) g ( n d ) f\ast g=\sum_{d|n}f(d)g(\frac{n}{d}) fg=dnf(d)g(dn)

  • 常见积性函数: μ , φ , I , ϵ , i d , d , σ \mu,\varphi,I,\epsilon,id,d,\sigma μ,φ,I,ϵ,id,d,σ
  • f ∗ ϵ = f f \ast \epsilon = f fϵ=f
  • μ ∗ I = ϵ \mu \ast I= \epsilon μI=ϵ 等价于 ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] dnμ(d)=[n=1]
  • φ ∗ I = i d \varphi \ast I=id φI=id 等价于 ∑ d ∣ n φ ( d ) = n \sum_{d|n}\varphi(d)=n dnφ(d)=n
  • 由上面两条可以推出 φ = i d ∗ μ \varphi = id \ast \mu φ=idμ ,即 φ ( n ) = ∑ d ∣ n d μ ( n d ) \varphi(n)=\sum_{d|n}d\mu(\frac{n}{d}) φ(n)=dndμ(dn)

反演定理:若 F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum_{d|n}f(d) F(n)=dnf(d) ,则 f ( n ) = ∑ d ∣ n μ ( d ) F ( n d ) f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d}) f(n)=dnμ(d)F(dn) 。(运用卷积很好证明)

另一种形式:若 F ( n ) = ∑ n ∣ d f ( d ) F(n)=\sum_{n|d}f(d) F(n)=ndf(d) ,则 f ( n ) = ∑ n ∣ d μ ( d n ) F ( d ) f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d) f(n)=ndμ(nd)F(d) 。(pit)



杜教筛

用于求解数论函数的前缀和,在线性筛预处理前面一些项之后,复杂度一般是 O ( n 2 3 ) O(n^\frac{2}{3}) O(n32)

比如说要求解 S ( n ) = ∑ i = 1 n f ( i ) S(n)=\sum_{i=1}^{n}f(i) S(n)=i=1nf(i) ,套路就是找到好求解的 h = g ∗ f h=g\ast f h=gf ,可以演变为:

g ( 1 ) S ( n ) = ∑ i = 1 n ( f ∗ g ) ( i ) − ∑ i = 2 n g ( i ) S ( ⌊ n i ⌋ ) g(1)S(n)=\sum_{i=1}^{n}(f \ast g)(i)-\sum_{i=2}^{n}g(i)S(\lfloor\frac{n}{i}\rfloor) g(1)S(n)=i=1n(fg)(i)i=2ng(i)S(in)

于是可以递归+数论分块求解。

常用函数前缀和:

  • 莫比乌斯函数: μ ∗ I = ϵ \mu \ast I=\epsilon μI=ϵ ,则 S ( n ) = 1 − ∑ i = 2 n S ( ⌊ n i ⌋ ) S(n)=1-\sum_{i=2}^{n}S(\lfloor\frac{n}{i}\rfloor) S(n)=1i=2nS(in) ;
  • 欧拉函数: μ ∗ I = i d \mu \ast I=id μI=id ,则 S ( n ) = n ( n + 1 ) 2 − ∑ i = 2 n S ( ⌊ n i ⌋ ) S(n)=\frac{n(n+1)}{2}-\sum_{i=2}^{n}S(\lfloor\frac{n}{i}\rfloor) S(n)=2n(n+1)i=2nS(in)



威尔逊定理

一个自然数 p 是素数,当且仅当 ( p − 1 ) ! ≡ − 1   ( m o d   p ) (p-1)!\equiv -1 \ (mod \ p) (p1)!1 (mod p)

你可能感兴趣的:(ACM算法总结)