数论 易

整除

对于两个整数 \(a\ ,\ b\) ,若 \(\exists k\in 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组数据,求 \(\displaystyle\sum_{i=1}^n \sum_{j=1}^m gcd(i,j)\)

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

\(\displaystyle{\begin{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\{ \begin{array}{lrc} ax+by=gcd(a,b)\\ bx'+(a\%b)y'=gcd(b,a\%b)\\a\%b=a-b*\lfloor\frac ab\rfloor\\gcd(a,b)=gcd(b,a\%b) \end{array} \right.\Rightarrow\left\{\begin{array}{lrc} x=y'\\y=x'-y'\lfloor\frac ab\rfloor \end{array} \right.\)

之后令\(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 \neq lcm(1,2,3,4,5)\)

例题: P1891 疯狂LCM

同余

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

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

性质

对称性:\(a\equiv b\pmod p\Rightarrow b\equiv a\pmod p\)

可乘性:若 \(a\equiv b\pmod p,c\equiv d\pmod p\) ,则 \(ac\equiv bd\pmod 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为任意积性函数)

\(\displaystyle\sum_{i=1}^{n}(f*g)(i)\)
\(\displaystyle{\begin{aligned} &= \sum\limits_{i=1}^{n} \sum \limits _{d|i} g(d)f(\frac{i}{d}) \\ &= \sum \limits _{d=1}^{n} g(d)\sum\limits _{i=1}^{\lfloor \frac{n}{d}\rfloor } f(i) \\ &= \sum \limits _{d=1}^{n} g(d) S(\lfloor \frac{n}{d} \rfloor) \end{aligned}}\)

\(g(1)S(n)=\sum_{d=1}^ng(d)S(\lfloor\frac nd\rfloor)-\sum_{d=2}^ng(d)S(\lfloor\frac nd\rfloor)\)

\(g(1)S(n)=\sum\limits_{i=1}^{n}(f*g)(i)-\sum_{d=2}^ng(d)S(\lfloor\frac nd\rfloor)​​​\)

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

例题: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_i\equiv 1 \ (mod \ m_i)\)的一个解

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

证明

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

又因为\(M_it_ia_i\equiv a_i\ (mod \ m_i)\)
所以 \(x=\displaystyle\sum_{i=1}^n M_it_i a_i\)

结论

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

正文

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

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

构造 \(n\) 个多项式 \(g_i(n)\).对于第 \(i\) 个多项式,对于\(\forall k\not= 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)=\displaystyle\sum_{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<<":\n";
        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<<"\n";
    }
    return ans;
}

例题:P4781 拉格朗日插值

莫比乌斯

积性函数

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

Dirichlet卷积

\((f*g)(n)=\displaystyle\sum_{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)=\displaystyle\sum_{d|n}\mu(d)​\)

例题

\(\displaystyle\sum_{i=1}^n\sum_{j=1}^m\sum_{d|i,j} \dfrac{ij}{gcd(\frac id,\frac jd)}\)

posted @ 2020-07-08 07:02  zh_dou  阅读(365)  评论(0编辑  收藏  举报