数论 易

整除

对于两个整数 (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)})

原文地址:https://www.cnblogs.com/zh-dou/p/13264732.html