欢迎来到SamXia的博客|

SamXia

园龄:1个月粉丝:1关注:2

2025-01-26 14:08阅读: 12评论: 0推荐: 0

数论笔记(2025.01.22) 持续更新

01.整除及证明

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

03. 质数有无穷多个

证明:

假设质数有最大数

令质数有n个,最大的质数为qn

可构造一数 p=所有质数之积(q1×q2×q3××qn)

对于p+1 必然满足不整除于q1,q2,q3,,qn

p+1为质数 且p+1>qn

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

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

证明:

大于2的质数都为偶数 即对于任意质数k>2kmod2=1

而对于奇数k必有k=2m+1=(m+1+m)(m+1m)=(m+1)2m2

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

05.唯一分解定理

任意整数n=p1a1×p2a2××pkak

因子个数 τ(n)=(1+a1)(1+a2)(1+a3)(1+ak)

m的唯一分解:m=cpcac

例题: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(logn)/可重复贡献性

gcd(a,b)=gcd(a,bka)=>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,ab),a,b

2.gcd(a,b)=2gcd(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)×lcm(a,b)=a×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. 同余

符号表示:ab(mod p)

01.若abcd (mod m)a+cb+d(mod m)

02.若abcd (mod m)acbd (mod m)

03.若ab (mod m)nNanbn(mod m)

例题:LuoguP3861

核心思路:

一种状态转移
dp[i][j]=dp[i][j1],a[i] a[j]

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

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

i.费马小定理

01.p为质数且gcd(p, a)=1ap11(mod p)

02.p为质数且gcd(p, a)=1apa(mod p)

ii.乘法逆元

01.定义: 若a×v1(mod p),va在模p意义下的逆元

02.p为质数且gcd(p, a)=1a在模p意义下的逆元为ap2

证明:

ap11(mod p)(费马小定理)

a×ap21(mod p)

因为a×v1(mod p)

v有一解为:ap2

求逆元代码:

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

思路:求逆元+取模即可

本文作者:SamXia

本文链接:https://www.cnblogs.com/SamXia/p/18691756

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   SamXia  阅读(12)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起