数 论 初 步 数论初步 数论初步
GDKOI 冬令营,算是正式开始面对数论吧。(我太菜了)
质数
1.1-N的质数个数(用于估计数组下标):
π
(
x
)
=
x
l
n
x
\pi (x)=\frac{x}{ln x}
π(x)=lnxx
2.试除法判断质数:复杂度
O
(
n
)
O(\sqrt{n})
O(n)
3 埃斯托尼克筛法:复杂度
O
(
N
l
o
g
l
o
g
N
)
O(N log log N)
O(NloglogN)
4.欧拉筛/线性筛:复杂度
O
(
N
)
O(N)
O(N)
附代码:
int prime[1000*1001],top;
bool pd[1000*10000+100];
void OL_find()
{
for(register int i=2;i<=n;i++)
{
if(!pd[i]) prime[++top]=i;
for(register int j=1;j<=top&&prime[j]*i<=n;j++)
{
pd[i*prime[j]]=true;
if(i%prime[j]==0) break;//关键!!!
}
}
}
约数
1.x能被y整除:
y
∣
x
y|x
y∣x
对于一个数N 有
N
=
p
1
c
1
⋅
p
2
c
2
⋅
.
.
.
.
.
.
⋅
p
m
c
m
N=p_1^{c_1}·p_2^{c_2}·......·{p_m}^{c_m}
N=p1c1⋅p2c2⋅......⋅pmcm
2.1~N的正约数个数:
(
c
1
+
1
)
∗
(
c
2
+
1
)
∗
.
.
.
.
.
.
∗
(
c
m
+
1
)
=
∏
i
=
1
m
(
c
i
+
1
)
(c_1+1)*(c_2+1)*......*(c_m+1)=\prod _{i=1} ^{m}(c_i+1)
(c1+1)∗(c2+1)∗......∗(cm+1)=i=1∏m(ci+1)
3.1~N的正约数和:
(
1
+
p
1
+
p
1
2
+
.
.
.
.
.
.
p
1
c
1
)
∗
.
.
.
.
.
.
∗
(
1
+
p
m
+
p
m
2
+
⋅
⋅
⋅
⋅
⋅
⋅
p
m
c
m
)
=
∏
i
=
1
m
(
∑
j
=
0
c
i
(
p
i
)
j
)
(1+p_1+p_1^2+......p_1^{c_1})*......*(1+p_m+p_m^2+······p_m^{c_m}) =\prod _{i=1}^{m}(\sum _{j=0}^{c_i}(p_i)^j)
(1+p1+p12+......p1c1)∗......∗(1+pm+pm2+⋅⋅⋅⋅⋅⋅pmcm)=i=1∏m(j=0∑ci(pi)j)
最大公约数,最小公倍数
a,b的最大公约数: 记为
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)
a,b的最小公倍数: 记为
l
c
m
(
a
,
b
)
lcm(a,b)
lcm(a,b)
性质:
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
−
b
)
=
g
c
d
(
a
,
a
−
b
)
九
章
算
术
⋅
更
相
减
损
术
gcd (a,b)=gcd(b,a-b)=gcd(a,a-b)~~~ 九章算术·更相减损术
gcd(a,b)=gcd(b,a−b)=gcd(a,a−b) 九章算术⋅更相减损术
g
c
d
(
a
,
b
)
∗
l
c
m
(
a
,
b
)
=
a
∗
b
gcd(a,b)*lcm(a,b)=a*b
gcd(a,b)∗lcm(a,b)=a∗b
g
c
d
(
m
⋅
a
,
m
⋅
b
)
=
m
∗
g
c
d
(
a
,
b
)
gcd(m~·a,m~·b)=m*gcd(a,b)
gcd(m ⋅a,m ⋅b)=m∗gcd(a,b)
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
m
o
d
b
)
欧
几
里
得
算
法
—
—
辗
转
相
除
法
gcd(a,b)=gcd(b,a~~mod~~b)~~欧几里得算法——辗转相除法
gcd(a,b)=gcd(b,a mod b) 欧几里得算法——辗转相除法
重头戏:欧拉函数
定义:
φ
(
N
)
\varphi (N)
φ(N)表示1~N之间与N互质数的个数
φ
(
N
)
=
N
∗
(
p
1
−
1
p
1
∗
p
2
−
1
p
2
∗
.
.
.
.
.
.
∗
p
m
−
1
p
m
)
=
N
∗
∏
p
∣
N
(
1
−
1
p
)
\varphi(N)=N*(\frac{p_1-1}{p_1}*\frac{p_2-1}{p_2}*......*\frac{p_m-1}{p_m})=N*\prod_{p|N}(1-\frac{1}{p})
φ(N)=N∗(p1p1−1∗p2p2−1∗......∗pmpm−1)=N∗p∣N∏(1−p1)
代码:
int f(int n)
{
int ans=n;
for(int i=2;i<=sqrt(n);++i)
if(n%i==0)
{
ans=ans*(i-1)/i;
while(n%i==0) n/=i;
}
if(n>1) ans=ans*(n-1)/n;
return ans;
}
此代码在对N试除时顺便求出了 φ ( n ) \varphi (n) φ(n)
·················································································································
未完待续
··················································································································