数论笔记(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
思路:求逆元+取模即可

浙公网安备 33010602011771号