数论学习笔记(一)

近期学了一下简单数论,整理一下。


一、算数基本定理:

1.定义: 一个大于1的正整数\(N\), 标准分解式
\[N=p_1^{a_1}p_2^{a_2}···p_n^{a_n}\]

2.性质:

  • 正因数个数
    \[d(N)=(a_1+1)(a_2+1)...(a_n+1)\]

  • 正因数和
    \[\sigma(N)=(1+p1+p1^2+...+p1^{a1})(a+p2+...+p2^{a2})...(1+pn+pn^2+pn^{an})\]


二、欧拉函数:

1. 定义:\(\varphi(x)\)表示小于x的数中有多少个数与x互质


2. 通式:
\[\varphi(x)=x\prod_{i=1}^{n}({1-\frac{1}{p_i}})\text{(p表示x的质因数)}\]

如何理解?

首先举个栗子:\(12=2^2·3 \quad \varphi(12)=12·(1-\frac{1}{2})·(1-\frac{1}{3})\)

用容斥的思想:12里有\(\frac{1}{2}\)的数是2的倍数,也有\(1-\frac{1}{2}\)的数不是2的倍数。(1,3,5,7,9,11)

那么这6个数中,又有\(\frac{1}{3}\)的数是3的倍数。

所以,有\((1-\frac{1}{2})·(1-\frac{1}{3})\)的数既不2的倍数,也不是3的倍数。

这样一来,通式也就好理解了!

x中有\((1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_n})\)个数满足\(p_1...p_n\)均不是其因子,即与x互质。


3.性质:

① 对质数p,\(\varphi(p)=p-1\)

\[\text{p是质数,所以1...p-1都与p互质。}\]

② 若n唯一分解\(\;n=p^k\),那么

\[\varphi(n)=n(1-\frac{1}{p})=p^k(1-\frac{1}{p})=p^k-p^{k-1}\]

③ 欧拉函数是积性函数,若\(a,b\)互质,

\[\varphi(ab)=\varphi(a)\varphi(b)\]

n为质数时,

\[\varphi(2n)=\varphi(2)\varphi(n)=\varphi(n)\]

④ 欧拉定理:对于互质整数\(a,m\),有

\[a^{\varphi(m)}\equiv1(mod\;m)\]

费马小定理:对质数\(p\)

\[a^p=1(mod\;p)\]

⑤ 小于n的数中,与n互质的数的总和为:

\[\varphi(n)*n/2(n>1)\]


\[\mathbf{n=\sum_{d|n}\varphi(d)}\]

因为是一条非常重要的性质,所以我自己想法子证明了一波:

\(\text{令}f(n)=\sum_{d|n}^{}\varphi(d)\)

\(\text{则}f(p_i^{k})=\varphi(1)+\varphi(p_i)+\varphi(p_i^{2})+\varphi(p_i^{3})+...+\varphi(p_i^{k})\)

\(\quad \quad\quad \;\;\;=1+(p_i-1)+(p_i^{2}-p_i)+(p_i^{3}-p_i^{2})+...+(p_i^{k}-p_i^{k-1})\)

\(\quad \quad\quad \;\;\;=p_i^{k}\)

\(n=p_1^{e_1}*p_2^{e_2}*p_3^{e_3}*...*p_k^{e_k}\)

\(\sum_{d|n}\varphi(d)=f(n)\)

\(\quad\quad\quad\quad\quad\;=f(p_1^{e_1}*p_2^{e_2}*p_3^{e_3}*...*p_k^{e_k})\)

\(\quad\quad\quad\quad\quad\;=f(p_1^{e_1})*f(p_2^{e_2})*f(p_3^{e_3})*...*f(p_k^{e_k})\)

\(\quad\quad\quad\quad\quad\;=p_1^{e_1}*p_2^{e_2}*p_3^{e_3}*...*p_k^{e_k}\)

\(\quad\quad\quad\quad\quad\; =n\)

证毕。


再放一下大佬的证明:

考虑1...n的所有整数,若\(gcd(i,n)=d\),即\(gcd(\frac{i}{d},\frac{n}{d})=1\)

\(\frac{i}{d}\) 是不超过 \(\frac{n}{d}\) 的整数。

∴ 这样的 \(i\)\(\varphi(\frac{n}{d})\)

\(d|n\),我们也就考虑到了所有的d。

即:\({n= \sum_{d|n}\varphi(\frac{n}{d})}=\sum_{d|n}{\varphi(d)}\)

⑦ 若p是质数

\[\begin{cases}\varphi(i*p)=p*\varphi(i)\quad(i\;mod\;p\;=0)\\\varphi(i*p)=p-1*\varphi(i)\quad(otherwise)\end{cases}\]

第二个式子很好理解,p是质数,i不是p的倍数,即i与p互质。

第一个式子,根据通式可得:

\[\varphi(i*p)=p*i*\prod_{i∈S_{i*p}}{\frac{p_i-1}{p_i}}\text{(S表示n的质因子集合)}\]

因为\(p\)\(i\)的质因子,所以\(S_i=S_{i*p}\)

所以

\[i*\prod_{i∈S_{i*p}}{\frac{p_i-1}{p_i}} = i*\prod_{i∈S_{i}}{\frac{p_i-1}{p_i}} = \varphi(i)\]

\[\varphi(i*p)=p*\varphi(i)\]


4. 求欧拉函数

  • 单个求: 直接根据定义在\(\sqrt{x}\)范围枚举x的质因子即可。复杂度\(O(\sqrt{n})\)
inline int phi(int x)
{
    int ret=x;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0) ret=ret/i*(i-1);
        while(x%i==0) x/=i;
    }
    if(x>1) ret=ret/x*(x-1);
    return ret;
}
  • 筛法求:

因为积性函数\(\varphi(ab)=\varphi(a)\varphi(b)\quad (a \perp b )\)

欧拉筛中每次筛\(i*prime[j]\),所以我们可以在欧拉筛中线性求积性函数。

关于\(phi[i*prime[j]]\)的值,见性质中最后一条。

inline void Pre()
{
    notpr[1]=phi[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!notpr[i]) prime[++cnt]=i,phi[i]=i-1;
        for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
        {
            notpr[i*prime[j]]=1;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            else phi[i*prime[j]]=phi[i]*phi[prime[j]];
        }
    }
}

既然理论知识已经基本了解了,我们来搞几道题。

一、P2303 [SDOi2012]Longge的问题

简单的推一波式子:

\(\sum_{i=1}^{n}gcd(i,n)\)

\(=\sum_{d|n}\sum_{i=1}^n([gcd(i,n)=d]·d)\)

\(=\sum_{d|n}d\sum_{i=1}^{\frac{n}{d}}[gcd(i,\frac{n}{d})=1]\)

\(=\sum_{d|n}d·\varphi(\frac{n}{d})\)

然后单个求欧拉函数就好了,注意枚举到\(\sqrt{n}\)即可。

code:
int main()
{
    cin>>n;
    for(ll i=1;i*i<=n;i++)
    {
        if(i*i==n){ans+=i*phi(i);break;}
        if(n%i==0) ans+=i*phi(n/i)+(n/i)*phi(i);
    }
    cout<<ans;
}

二、P2158 [SDOI2008]仪仗队

首先我们把左下角的点看做(0,0)点。

我们要求的也就是有多少条过(0,0)点的不重合的形如\(y=kx\)的直线。

也就是求有多少个不同的k值。

\(P(x,y),\quad k=\frac{y}{x}\)

首先k值不同当且仅当(x,y)互质。

又不同的互质数相除得数肯定不同。

所以我们要求的就是n范围内有多少对(x,y)互质。

\(\sum_{x=1}^{n-1}\sum_{y=1}^{x-1}[gcd(x,y)=1]\)

\(=\sum_{x=1}^{n-1}\varphi(x)\)

\(\varphi(n)\)表示小于n的数里与n互质的数,也就是说我们只求了x>y的情况,需要再把结果*2。

然后注意一下(1,0),(0,1),(1,1)这三个点的特判。

int main()
{
    read(n);Pre();
    if(n==1){puts("0");return 0;}
    for(int i=2;i<n;i++) ans+=phi[i]*2;
    W(ans+1);
}

三、P1447 [NOI2010]能量采集

给你一个n·m的方阵,问每个点与原点的连线中有多少点(不包括横纵坐标为0的)*2+1再求和,

\(\sum_{x=1}^{n}\sum_{y=1}^{m}gcd(x,y)*2-1\)

\(2*(\sum_{x=1}^{n}\sum_{y=1}^{m}gcd(x,y))-n*m\)

我们只考虑一下中间那个东西:

\(\;\;\;\sum_{x=1}^{n}\sum_{y=1}^{m}gcd(x,y)\)

\(=\sum_{i=1}^n\sum_{j=1}^{m}\sum_{d|gcd(i,j)}\varphi(d)\)

\(=\sum_{d=1}^{n}\varphi(d)·(n/d)·(m/d)\)

求一下phi的前缀和然后套数论分块就好了。

四、P2568 GCD

五、P2398 GCD SUM

转载于:https://www.cnblogs.com/chu-xuan/p/10548422.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值