数论笔记(2025.01.22) 持续更新

\(01.\)整除及证明

\(02.\) 特殊性质\(π(n) \approx n/logn\)(应用于定理证明)

\(03.\) 质数有无穷多个

证明:

假设质数有最大数

令质数有\(n\)个,最大的质数为\(q_n\)

可构造一数 \(p=\)所有质数之积(\(q_1\times q_2\times q_3\times ……\times q_n\))

对于\(p+1\) 必然满足不整除于\(q_1,q_2,q_3,……,q_n\)

\(p+1\)为质数 且\(p+1>q_n\)

所以没有最大的质数 假设不成立

\(04.\)所有大于2的质数都可以唯一地表示成两个平方数之差

证明:

大于2的质数都为偶数 即对于任意质数\(k>2\)\(k \mod 2=1\)

而对于奇数k必有\(k=2m+1=(m+1 +m )(m+1 -m)=(m+1)^2-m^2\)

由此得证,且可同时证明两个平方数的差值为\(1\)

\(05.\)唯一分解定理

任意整数$ n = p_1^{a_1} \times p_2^{a_2} \times \cdots \times p_k^{a_k} $

因子个数 \(\tau(n) = (1+a_1) (1+ a_2)(1+a_3) \cdots (1 + a_k)\)

\(m\)的唯一分解:$m=\prod_{c} p_c^{a_c} $

例题:LuoguP1075

核心代码:

bool prime(long long n)
{
	if(n==1)	return false;
	if(n==2)	return true;	
	for(long long i=2;i<=sqrt(n);i++)
		if(n%i==0)
			return false;
			
	return true;
}

\(06.\) 辗转相除:\(O(log n)\)/可重复贡献性

\(gcd(a,b)=gcd(a,b-ka) =>gcd(a,b)=gcd(a,b\)%\(a)\)

\(gcd(a,b,c)=gcd(gcd(a,b),gcd(b,c))\)

\(p.s.\)__ $ gcd() $ => \(STL自带最大公约数\)

例题: CF1562A

核心代码:

int k=r/2+1;

if(k>=l)//case1
  //l在左边 
  cout<<r%k<<"\n";

else
  cout<<r-l<<"\n";

\(07.\) \(Stein\)算法:在高精度计算中避免取模

1.\(gcd(a,b)=gcd(a,a-b),a,b为奇数\)

2.\(gcd(a,b)=2*gcd(a/2,b/2),a,b为偶数\)

3.\(gcd(a,b)=gcd(a/2,b),a为偶数,b为奇数\)

4.\(gcd(a,b)=gcd(a,b/2),a为奇数,b为偶数\)

例题:LuoguP2152

注意:高精度要压位!!! 要不然过不了

其他套模板即可

\(08.\) 最小公倍数计算公式\(gcd(a,b)\times lcm(a,b)=a \times b\)

\(p.s.\) \(lcm\)代码

int lcm(int a,int b)
{ return a/gcd(a,b)*b; } 

例题:AT_abc152_e

暴力思路 (直接照搬过不了此题):

for(int i=1;i<=n;i++)
{
  cin>>a[i];	
  lcm=a[i]*lcm/__gcd(a[i],lcm);
}

\(09.\)埃氏筛

代码如下,复杂度\(O(n\) \(logn)\)

注意要学习埃氏筛的时间复杂度计算方法

vector<int> Prime;
bool isPrime[maxn];
void Sieve(int n)
{
  memset(isPrime,1,sizeof isPrime);
  isPrime[0]=isPrime[1]=0;
  for(int i=2;i<=n;++i)
  {
    if(isPrime[i]) Prime.push_back(i);
    for(int j=i*2;j<=n;j+=i)
      isPrime[j]=0;
  
  }
  return;
}

\(10.\)欧拉筛

写法1:数组模拟 应用于\(n>1e7\) (我自己打的 有bug可以反映)

void ola()
{
  for(int i=2;i<=n;i++)
  	{
  		if(vis[i]==0)
  		prime[++cnt]=i;
  		
  		for(int j=1;j<=cnt&&prime[j]*i<=n;j++)
  		{
  				vis[prime[j]*i]=1;
  				if(i%prime[j]==0)
  					break;
  		}
  	}
}

写法2:\(vector\)做法

void Sieve(int n)
{
  memset(isPrime,1,sizeof isPrime);
  isPrime[0]=isPrime[1]=0;
  for(int i=2;i<=n;++i)
  {
    if(isPrime[i]){ Prime.push_back(i); }
    each(ver,Prime)
    { // 从小到大遍历已经筛出来的质数
      if(1ll*i*ver>n) break;
      isPrime[i*ver]=0;
      if(i%ver==0){ break; }
    }
  }
}

\(11.\) 同余

符号表示:\(a\equiv b(mod\) \(p)\)

01.若\(a \equiv b\)\(c \equiv d\) \((mod\) \(m)\)\(a+c\equiv b+d(mod\) \(m)\)

02.若\(a \equiv b\)\(c \equiv d\) \((mod\) \(m)\)\(ac\equiv bd\) \((mod\) \(m)\)

03.若\(a \equiv b\) \((mod\) \(m)\)\(n \in N\)\(a^n\equiv b^n(mod\) \(m)\)

例题:LuoguP3861

核心思路:

一种状态转移
\(dp[i][j]=dp[i][j-1],a[i]\) \(\mid\) \(a[j]\)

另一种状态转移自己推 太长了不想打

12.费马小定理+乘法逆元

i.费马小定理

\(01.p\)为质数且\(gcd(p,\) \(a)=1\)\(a^{p-1} \equiv 1(mod\) \(p)\)

\(02.p\)为质数且\(gcd(p,\) \(a)=1\)\(a^{p} \equiv a(mod\) \(p)\)

ii.乘法逆元

\(01.\)定义: 若\(a \times v \equiv 1(mod\) \(p),\)\(v\)\(a\)在模\(p\)意义下的逆元

\(02.p\)为质数且\(gcd(p,\) \(a)=1\)\(a\)在模\(p\)意义下的逆元为\(a^{p-2}\)

证明:

$a^{p-1} \equiv1(mod $ \(p)\)(费马小定理)

\(a \times a^{p-2} \equiv 1(mod\) \(p)\)

因为\(a \times v \equiv 1(mod\) \(p)\)

\(v\)有一解为:\(a^{p-2}\)

求逆元代码:

const int mod = 998244353; 
int qpow(int a,int b,int p=mod)
{
  int res=1,tmp=a;
  while(b)
  {
   if(b&1) res=1ll*res*tmp%p;
   tmp=1ll*tmp*tmp%p;
   b>>=1;
  }
  return res;
}
int inv(int k){ return qpow(k,p-2,p); }

例题:Luogu P2613

思路:求逆元+取模即可

posted @ 2025-01-26 14:08  SamXia  阅读(53)  评论(0)    收藏  举报