数论

数论

同余

性质

  • \(+\) \(-\) \(\times\) 号都可以进行边运算边取模,但是 \(\div\) 不可以,需要使用逆元。
  • 所以可知 模运算满足: 结合律,交换律,分配律 。
  • \(a\) , \(b\) 除以 \(m\) 的余数相同, 那么就称 \(a\) , \(b\)\(m\) 互余 , 记作 \(a \equiv b\) $(mod $ \(m)\)
  • \(m\) 的同余类一共有 \(m\) 个,它们构成 \(m\) 的完全剩余系 。
  • 同余是等价关系,即同余具有自反性,对称性,传递性.
  • 若存在 \(a \equiv b\) $(mod $ \(m)\) , 则满足\(a^k \equiv b^k\) $(mod $ \(m)\)
  • 若存在 \(a \equiv b\) $(mod $ \(m)\) , 且满足\(d \mid a\) , \(d \mid b\) , \(d \mid m\) ,则满足$ {a\over d} \equiv {b\over d}$ $(mod $ \({m\over d})\)

欧拉定理

  • \({\varphi(p)}\) 表示在 \(1 \sim {p-1}\) 中与 \(p\) 互质的数的个数

性质

  • \(n\) 为质数,则 \({\varphi(p)} = p-1\)
  • \({\varphi(p)} = p \times \prod_{{p为质数}{\ }{c \mid p}} \frac{1}{c} (c\in 1\sim{p-1})\)
  • \({\varphi(p^k)} = p^{k-1} \times (k-1)\)
  • 因为欧拉函数为积性函数,所以当 \(a,b\)为质数时,有\({\varphi(ab)} = {\varphi(a)} \times {\varphi(b)}\)
由性质2可得\(\Theta(\sqrt{n})\)求欧拉函数的方法,代码如下。
int phi(int x){
	int n=x;
	int sum=n;
	for(int i=2;i*i<=n;i++){
		if(x%i)	continue;
		sum=sum/i*(i-1);
		while(x%i==0)	x/=i;
	}
	if(x>=2)	sum=sum/x*(x-1);
	return sum;
}

_若 \(a\)\(p\) 互质 ,则\(a^{\varphi(p)} \equiv 1\) $(mod $ \(p)\)

证明:我们可以构造出一个数列\({x_1,x_2,x_3,…,x_{\varphi(p)}}\),为模 \(p\) 的简单剩余系,那么则\({ax_1,ax_2,ax_3,…,ax_{\varphi(p)}}\)也为模 \(p\) 的简单剩余系。因为\(a\)\(p\) 互质,所以\({x_1x_2x_3…x_{\varphi(p)}}\) $(mod $ \(p) \equiv a{x_1 \times ax_2 \times ax_3 \times … \times ax_{\varphi(p)}} \equiv a^{\varphi(p)}{x_1x_2x_3…x_{\varphi(p)}}\) $(mod $ \(p)\) ,约分后即证

费马小定理

\(p\) 是质数,$\forall a\in \tt Z $ ,\(a^p \equiv a\) $(mod $ \(p)\) ,若 \(a\)\(p\) 互质,那么有 \(a^{p-1} \equiv 1\) $(mod $ \(p)\)

证明为欧拉定理中当 \(p\) 为质数,\(\varphi(p)=p-1\) 的情况

欧几里得算法(辗转相除法)

  • \({gcd(a,b)=gcd(b,a \% b )}\)

裴蜀定理(扩欧)

  • 对于任意整数 \(a,b\),一定存在一对整数 \(x,y\) 满足 \(ax+by=gcd(a,b)\)

证明:

  • \(b=0\) 时,一定存在有 \(x=1,y=0\) 的特解
  • 其他时候 会得到 \(gcd(a,b)=gcd(b,a\%b)\),可以写成\(gcd(b,a-b\times\lfloor{a/b}\rfloor)\),所以 \(bx+(a\%b)y=bx+({a-b\times\lfloor{a/b}\rfloor})y\)
    -所以 \(ax+by\) 可以换为 \(ay+b(x-y\times\lfloor{a/b}\rfloor)\)
  • 通过这样迭代递归一定可以使原式得到解

例题:

仪仗队

  • 观察题目可以得到满足要求的点一定要满足 \(gcd(x,y)=1\),证明很简单,如果不满足,那么会被 \((x\div gcd(x,y),y \div gcd(x,y))\)挡住
  • 暴力加 复杂度 \(\Theta(n^2)\)
  • 考虑优化,发现这个东西和每个数的欧拉函数有点相似,于是可以预处理出每个数的欧拉函数,然后\(\Theta(n)\)遍历,
  • 注意:本思想是以(1,1)上方的(2,2)作为第一个点,然后把第1列,第1排的点和(2,2)特殊处理一下。
#include<bits/stdc++.h>
using namespace std;
int n,prime[10000010],st[10000100],oprime[10000100];
void olprimes(){
	int cnt=0;
	for(int i=2;i<=n;i++){
		if(!st[i]){
			prime[++cnt]=i;
			oprime[i]=i-1;
		}
		for(int j=1;j<=n&&prime[j]<=n/i;j++){
			st[prime[j]*i]=1;
			if(i%prime[j]==0){
				oprime[i*prime[j]]=prime[j]*oprime[i];
				break;
			}
			oprime[i*prime[j]]=prime[j]*oprime[i]-oprime[i];
		}
	}
}
int main(){
	cin>>n;
	int ans=0;
	olprimes();
	for(int i=1;i<n;i++){
		ans+=oprime[i];		
	}
    if(ans==0){
        cout<<0;
        return 0;
    }
	cout<<ans*2+3;
	return 0;
}
posted @ 2024-09-13 08:11  lmy333  阅读(56)  评论(0)    收藏  举报