zoukankan      html  css  js  c++  java
  • 数论 易

    整除

    对于两个整数 (a , b) ,若 (exists kin Z) 使 (ak=b) 则称 (a) 整除 (b) ,记做 (a|b)

    快速幂

    好像没什么好讲的...讲下证明

    对于求 (x^y) ,将 (y) 表示为二进制,如: (105_{(10)}=1101001_{(2)})

    所以 (x^y=x^{2^6+2^5+2^3+2^0}=x^{2^6}x^{2^5}x^{2^3}x^{2^0})

    x ans
    (x) (x^{2^0})
    (x^2) (x^{2^0})
    (x^4) (x^{2^0})
    (x^8) (x^{2^3}x^{2^0})
    (x^{16}) (x^{2^3}x^{2^0})
    (x^{32}) (x^{2^5}x^{2^3}x^{2^0})
    (x^{32}) (x^{2^6}x^{2^5}x^{2^3}x^{2^0})

    (mathcal{Code}:)

    #define int long long
    int ksm(int a,int b,int mod){
        int ans=1;
        while(b){
            if(b&1) ans=ans*a%mod;
            a=a*a%mod;
            b>>=1;
        }
        return ans%mod;
    }
    

    例题:P1226 快速幂

    gcd​​​

    对于两个数 (a) , (b) 的最大公约数

    裴蜀定理

    对于任意 (x , y)(exists a,b) 满足 (ax+by=gcd(x,y))

    证明:就算百度百科你们都能看懂

    应用

    用来做题

    可以用来证明奇奇怪怪的东西和推式子

    信息上对于这东西常见的套路是枚举(gcd​​​)

    如:给你T组数据,求 (displaystylesum_{i=1}^n sum_{j=1}^m gcd(i,j))

    其中有一步是标准的枚举 (gcd​​​)

    (displaystyle{egin{aligned}&sum_{i=1}^n sum_{j=1}^m gcd(i,j)\=&sum_{i=1}^n sum_{j=1}^m sum_{d|i,j}d[gcd(frac id,frac jd)==1]end{aligned}}​)

    (mathcal{Code}:​​​)

    //__gcd(x,y)
    //emmming...
    inline void gcd(int a,int b){
        return b==0?a:gcd(b,a%b);
    }
    

    例题(注意卡常):UVA11426 GCD - Extreme (II)

    exgcd​​

    定义

    一种算法

    首先根据裴蜀定理,对于等式 (ax+by=gcd(a,b)) 一定存在整数解

    (EXgcd) 就是求该等式的一组特解

    求法

    推柿子~

    (left{ egin{array}{lrc} ax+by=gcd(a,b)\ bx'+(a\%b)y'=gcd(b,a\%b)\a\%b=a-b*lfloorfrac ab floor\gcd(a,b)=gcd(b,a\%b) end{array} ight.Rightarrowleft{egin{array}{lrc} x=y'\y=x'-y'lfloorfrac ab floor end{array} ight.)

    之后令(g=gcd(a,b)​​​)
    (lcm(a,b)=a*b/g​​​)
    (ax+lcm(a,b)+by-lcm(a,b)=c​​​)

    故有 (a(x+b/g)+b(y-a/g)=c)
    由此可得,(x) 加上或减去任意倍数的 (b/gcd(a,b)) 后均有对应的y的解
    (t=b/g)((x\%t+t)\%t) 就是x的最小非负解

    (mathcal{Code:}​)

    inline void exgcd(int a,int b,int &x,int &y){
        if(!b){
            x=1;y=0;
            return;
        }
        exgcd(b,a%b,y,x);
        y-=a/b*x;
    }
    

    例题:POJ1061 青蛙的约会

    (lcm)

    这个真没什么好说的

    (lcm) 这东西在数论推柿子里因没有什么性质而遭到嫌弃

    通常把 (lcm​) 转化为 (gcd​) 来做: (lcm(i,j)=frac {i*j}{gcd(i,j)}​)

    注意,这一条性质只在两个数时才成立,其他情况不一定,比如

    (frac {1*2*3*4*5}{gcd(1,2,3,4,5)} = 1*2*3*4*5 eq lcm(1,2,3,4,5))

    例题: P1891 疯狂LCM

    同余

    对于两整数 (a , b)(amod p=bmod p) 则称 (a)(b) 在模 (p) 意义下同余

    用符号表示则为 (a equiv b pmod p​​​)

    性质

    对称性:(aequiv bpmod pRightarrow bequiv apmod p)

    可乘性:若 (aequiv bpmod p,cequiv dpmod p) ,则 (acequiv bdpmod p)

    应用

    对于信息比较基本,没有什么应用,主要用在定理的证明和表达中

    对于同余式 (ax equiv b pmod p) ,可以转化为 (ax+kp=b) 就可以应用 exgcd 求了

    特殊的,对于同余式 (a equiv 1 pmod p​) 的一个解是 (a​​​) 在模 (p​​​) 意义下的逆元

    例题: P1082 同余方程

    逆元

    对于整数(a,p)(exists a^{-1}) 满足 (a*a^{-1} equiv 1(mod p)) 则称 (a^{-1})(a) 在模 (p) 意义下的逆元

    主要用于除法取模问题

    因为除法不对模运算封闭,所以逆元应运而生

    求逆元主要用两种方法,一是费马小定理,二是 exgcd,三是线性

    只列出线性的代码

    (mathcal{Code}:)

    inv[1]=1;
    for(int i=2;i<=n;i++)
        inv[i]=((p-p/i)*inv[p%i])%p;
    

    例题:P3811 乘法逆元,P5431 乘法逆元2

    埃拉托色尼筛法

    复杂度 $O(n loglogn) $

    所以建议用欧拉筛 (O(n))

    在此讲一下原理

    对于一个数 (a) , 则 (k*a (k in N^*)) 一定不会在之后的循环中进入素数表,所以给他们打上标记

    因为埃氏筛会对一些数重复筛,所以复杂度就不如欧拉筛优

    (mathcal{Code}:)

    inline void pri(){
        for(int i=2;i<=n;i++){
            if(!ispri[i]) prime[++cnt]=i;
            for(int j=1;j<=cnt;j++){
                ispri[i*prime[j]]=1;
    //			if(!(i%prime[j])) break;
            }
        } 
    }
    

    例题:P3383 线性筛素数(这题好像 (Theta (n^2)) 都能过)

    杜教筛

    对于一个积性函数 (f),我们要求 (sum_{i=1}^n f(i))

    (mathcal{Ans})

    (S(n)=sum_{i=1}^n f(i))(h=g*f) (h,g为任意积性函数)

    (displaystylesum_{i=1}^{n}(f*g)(i))
    (displaystyle{egin{aligned} &= sumlimits_{i=1}^{n} sum limits _{d|i} g(d)f(frac{i}{d}) \ &= sum limits _{d=1}^{n} g(d)sumlimits _{i=1}^{lfloor frac{n}{d} floor } f(i) \ &= sum limits _{d=1}^{n} g(d) S(lfloor frac{n}{d} floor) end{aligned}})

    (g(1)S(n)=sum_{d=1}^ng(d)S(lfloorfrac nd floor)-sum_{d=2}^ng(d)S(lfloorfrac nd floor))

    (g(1)S(n)=sumlimits_{i=1}^{n}(f*g)(i)-sum_{d=2}^ng(d)S(lfloorfrac nd floor)​​​)

    进行预处理&数论分块即可

    例题:P4213 杜教筛

    Lagrange 插值

    孙子定理

    (m_1,m_2,cdots,m_n)是两两互质的正整数,(M=prod_{i=1}^n{m_i})(M_i=M/m_i) , (t_i)是线性同余方程(M_it_iequiv 1 (mod m_i))的一个解

    对于任意的n个整数(a_1,a_2,cdots,a_n​),则同余方程组: (egin{cases}x≡a_1(mod m_1)\x≡a_2(mod m_2)\ cdots cdots\x≡a_n(mod m_n)\end{cases}​) 有整数解(x=displaystylesum_{i=1}^n M_it_i a_i​).并且在(mod M​) 意义下有唯一解。

    证明

    因为(M_i=M/m_i) 是除(m_i)之外所有模数的倍数,所以(forall k ot=i , M_it_ia_iequiv 0 (mod m_k))

    又因为(M_it_ia_iequiv a_i (mod m_i))
    所以 (x=displaystylesum_{i=1}^n M_it_i a_i)

    结论

    CRT给出了模数两两互质的线性同余方程组的一个特解。方程组的通解可以表示为 (x+kM (kinmathbb Z)​)。有些题目要求我们求出最小的非负整数解,只需把 (x​)(M​) 取模,并让x落在 ([1,M)​) 内即可。

    正文

    对于一个多项式 (f(x)​),其图像在坐标系内经过 (n​) 个点 ((x_i,y_i)​)

    我们考虑对于此多项式的“孙子定理”:

    构造 (n) 个多项式 (g_i(n)).对于第 (i) 个多项式,对于(forall k ot= i ,g_i(x_k)=0),而 (g_i(x_i)=1),即 (g_i(x_i)*y_i=y_i)

    则可得 (g_i(x)=dfrac{(x-x_1)(x-x_2)cdots(x-x_{i-1})(x-x_{i+1})cdots(x-x_n)}{(x_i-x_1)(x_i-x_2)cdots(x_i-x_{i-1})(x_i-x_{i+1})cdots(x_i-x_n)}​)

    所以 (f(x)=displaystylesum_{i=1}^n g_i(x)*y_i​)

    (mathcal{Code}​)

    inline int Lagrange(){//求f(k)%998244353
        int ans=0;
        for(int i=1,res;i<=n;i++){
            res=1;
    //		cout<<i<<":
    ";
            for(int j=1;j<=n;j++){
                if(j==i) continue;
                res=(res*((x[i]+mod-x[j])%mod))%mod;
            }
            res=ksm(res,mod-2);
            for(int j=1;j<=n;j++){
                if(j==i) continue;
                res=(res*((k+mod-x[j])%mod))%mod;
            }
            res=res*y[i]%mod;
            ans=(ans+res)%mod;
    //		cout<<ans<<"
    ";
        }
        return ans;
    }
    

    例题:P4781 拉格朗日插值

    莫比乌斯

    积性函数

    积性函数指:(forall a, b ∈ mathbb N^+,gcd(a, b) = 1,s.t.f(ab)=f(a)f(b))

    Dirichlet卷积

    ((f*g)(n)=displaystylesum_{d|n}f(d)g(dfrac nd))

    性质

    1. 交换律:(f*g=g*f)
    2. 结合律:((f*g)*h=f*(g*h))
    3. 分配律:(f*(g+h)=f*g+f*h)
    4. 单位元:(f*epsilon=f)
    5. (f,g) 为积性函数,那么 (f*g) 也是积性函数。

    莫比乌斯等式

    (epsilon(n)=displaystylesum_{d|n}mu(d)​)

    例题

    (displaystylesum_{i=1}^nsum_{j=1}^msum_{d|i,j} dfrac{ij}{gcd(frac id,frac jd)})

  • 相关阅读:
    【Learning】积性函数前缀和——洲阁筛(min_25写法)
    GDOI2018记录
    最近公共祖先(一道题目)
    Counting
    【BZOJ4872】【Shoi2017】分手是祝愿
    【BZOJ2654】tree
    数学竞赛
    A
    【bzoj 3131】[Sdoi2013]淘金
    【Never Stop】联赛集训记录
  • 原文地址:https://www.cnblogs.com/zh-dou/p/13264732.html
Copyright © 2011-2022 走看看