莫比乌斯函数
首先把
n
n
n按照唯一分解定理变成
∏
i
=
1
k
p
i
c
i
\large\prod_{i=1}^{k}p_i^{c_i}
∏i=1kpici
那么若
∀
x
∈
p
\forall x\in p
∀x∈p
μ
(
n
)
=
{
1
[
n
=
=
1
]
0
[
n
 
m
o
d
 
x
2
=
=
0
]
(
−
1
)
k
\mu(n)=\begin{cases}1[n==1]\\0[n\bmod x^2==0]\\(-1)^k\end{cases}
μ(n)=⎩⎪⎨⎪⎧1[n==1]0[nmodx2==0](−1)k
那么就可以用线性筛来解决,代码
inline void init(){
mu[1]=1; register int m=0;
for (register int i=2;i<=N;++i){
if (!v[i]) v[i]=i,prime[++m]=i,mu[i]=-1;
for (register int j=1;j<=m&&prime[j]*i<=N;++j){
v[prime[j]*i]=prime[j];
if (i%prime[j]==0) break;
mu[prime[j]*i]=-mu[i];
}
}
}
整除分块
Example
求 ∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^n\lfloor\frac{n}{i}\rfloor i=1∑n⌊in⌋
分析
可以感性理解,一个数
n
n
n最多有
2
n
2\sqrt n
2n中取值,那么其实只有
2
n
2\sqrt n
2n次枚举是有意义的;
当然,也可以理解成只有正好
⌊
n
i
⌋
=
n
i
\large\lfloor\frac{n}{i}\rfloor=\frac{n}{i}
⌊in⌋=in才是需要枚举的,
因为其它取值都可以等同于下取整,所以枚举
n
n
n的约数个数次是最优的,不管怎样,其实也是容易理解的
代码
register int ans=0;
for (register int l=1,r;l<=k;l=r+1){
r=n/(n/l);
ans+=(r-l+1)*(n/l);
}
相关 |
---|
洛谷 2261 余数之和 |
洛谷 1447 能量采集(我知道可以 O ( n ) O(n) O(n)过) |
洛谷 3935 Calculating ≈ \approx ≈洛谷 2424 约数和 |
洛谷 2280 模积和 ≈ \approx ≈洛谷 2834 能力测验 |
莫比乌斯函数的性质
- ∑ d ∣ n μ ( d ) = [ n = = 1 ] \sum_{d|n}\mu(d)=[n==1] d∣n∑μ(d)=[n==1]可以通过容斥证明
- ∑ d ∣ n μ ( d ) d = φ ( n ) n \sum_{d|n}\frac{\mu(d)}{d}=\frac{\varphi(n)}{n} d∣n∑dμ(d)=nφ(n)先设置悬念
莫比乌斯反演
若
F
(
n
)
F(n)
F(n)和
f
(
n
)
f(n)
f(n)是非负整数集合中的两个函数,且满足
F
(
n
)
=
∑
d
∣
n
f
(
d
)
F(n)=\sum_{d|n}f(d)
F(n)=d∣n∑f(d)
那么
f
(
n
)
=
∑
d
∣
n
μ
(
d
)
F
(
n
d
)
f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d})
f(n)=d∣n∑μ(d)F(dn)
证明:
∑
d
∣
n
μ
(
d
)
F
(
n
d
)
=
∑
d
∣
n
μ
(
d
)
∑
k
∣
n
d
f
(
k
)
=
∑
k
∣
n
f
(
k
)
∑
d
∣
n
k
μ
(
d
)
=
f
(
n
)
\sum_{d|n}\mu(d)F(\frac{n}{d})=\sum_{d|n}\mu(d)\sum_{k|\frac{n}{d}}f(k)=\sum_{k|n}f(k)\sum_{d|\frac{n}{k}}\mu(d)=f(n)
d∣n∑μ(d)F(dn)=d∣n∑μ(d)k∣dn∑f(k)=k∣n∑f(k)d∣kn∑μ(d)=f(n)
积性函数
定义
对于一个数论函数
f
f
f,且
f
(
1
)
=
1
f(1)=1
f(1)=1,满足任意两个互质的整数
p
,
q
p,q
p,q都满足
f
(
p
q
)
=
f
(
p
)
×
f
(
q
)
f(pq)=f(p)\times f(q)
f(pq)=f(p)×f(q),那么这个函数就是积性函数
特别地,若任意整数
p
,
q
p,q
p,q都满足
f
(
p
q
)
=
f
(
p
)
×
f
(
q
)
f(pq)=f(p)\times f(q)
f(pq)=f(p)×f(q),那么就是完全积性函数
Example(积性函数) |
---|
莫比乌斯函数: μ ( n ) \mu(n) μ(n) |
欧拉函数: φ ( n ) = ∑ i = 1 n [ g c d ( n , i ) = = 1 ] \large\varphi(n)=\sum_{i=1}^n[gcd(n,i)==1] φ(n)=∑i=1n[gcd(n,i)==1];欧拉定理 ∑ n   m o d   d = 0 φ ( d ) = n \large\sum_{n\bmod d=0}\varphi(d)=n ∑nmodd=0φ(d)=n |
约数个数: d ( n ) = ∑ i = 1 n [ n   m o d   i = = 0 ] d(n)=\sum_{i=1}^n[n\bmod i==0] d(n)=∑i=1n[nmodi==0] |
约数和函数: σ ( n ) = ∑ n   m o d   i = 0 i \sigma(n)=\sum_{n\bmod i=0}i σ(n)=∑nmodi=0i |
以下是完全积性函数 |
元函数: ϵ ( n ) = [ n = = 1 ] \epsilon(n)=[n==1] ϵ(n)=[n==1];怎么如此熟悉?! |
恒等函数: I ( n ) = 1 I(n)=1 I(n)=1 |
单位函数: i d ( n ) = n id(n)=n id(n)=n |
好像都没用啊,其实用处大着呢
狄利克雷卷积
定义
两个数论函数
f
,
g
f,g
f,g的卷积为
(
f
∗
g
)
(
n
)
=
∑
d
∣
n
f
(
d
)
∗
g
(
n
d
)
(f*g)(n)=\sum_{d|n}f(d)*g(\frac{n}{d})
(f∗g)(n)=∑d∣nf(d)∗g(dn),一般后面括号省略不写,默认为
n
n
n
感性理解,它满足交换律、结合律和分配率,即
交换律:
(
f
∗
g
)
=
(
g
∗
f
)
(f*g)=(g*f)
(f∗g)=(g∗f)
结合律:
(
(
f
∗
g
)
∗
h
)
=
(
f
∗
(
g
∗
h
)
)
((f*g)*h)=(f*(g*h))
((f∗g)∗h)=(f∗(g∗h))
分配率:
(
(
f
+
g
)
∗
h
)
=
(
f
∗
h
)
+
(
g
∗
h
)
((f+g)*h)=(f*h)+(g*h)
((f+g)∗h)=(f∗h)+(g∗h)
可以知道
(
f
∗
ϵ
)
=
f
(f*\epsilon)=f
(f∗ϵ)=f
证明性质
换一种方法证明莫比乌斯反演
f
(
n
)
=
∑
d
∣
n
F
(
d
)
×
μ
(
n
d
)
f(n)=\sum_{d|n}F(d)\times \mu(\frac{n}{d})
f(n)=∑d∣nF(d)×μ(dn)
已知
F
(
n
)
=
∑
d
∣
n
f
(
d
)
F(n)=\sum_{d|n}f(d)
F(n)=∑d∣nf(d)
也就是
F
=
(
f
∗
I
)
F=(f*I)
F=(f∗I)
同时卷上
μ
\mu
μ得到
F
∗
μ
=
f
∗
I
∗
μ
F*\mu=f*I*\mu
F∗μ=f∗I∗μ
已知
∑
d
∣
n
μ
(
d
)
=
[
n
=
=
1
]
\sum_{d|n}\mu(d)=[n==1]
∑d∣nμ(d)=[n==1]
也就是
μ
∗
I
=
ϵ
\mu*I=\epsilon
μ∗I=ϵ
所以
F
∗
μ
=
f
∗
ϵ
=
f
F*\mu=f*\epsilon=f
F∗μ=f∗ϵ=f
所以
f
=
F
∗
μ
f=F*\mu
f=F∗μ
再来证明
∑
d
∣
n
μ
(
d
)
d
=
φ
(
n
)
n
\sum_{d|n}\frac{\mu(d)}{d}=\frac{\varphi(n)}{n}
d∣n∑dμ(d)=nφ(n)
根据欧拉定理
∑
d
∣
n
φ
(
d
)
=
n
\sum_{d|n}\varphi(d)=n
∑d∣nφ(d)=n
也就是
φ
∗
I
=
i
d
\varphi*I=id
φ∗I=id
同乘
μ
\mu
μ得到
φ
∗
I
∗
μ
=
i
d
∗
μ
\varphi*I*\mu=id*\mu
φ∗I∗μ=id∗μ
所以
φ
∗
ϵ
=
φ
=
i
d
∗
μ
\varphi*\epsilon=\varphi=id*\mu
φ∗ϵ=φ=id∗μ
即
φ
(
n
)
=
∑
d
∣
n
d
∗
μ
(
n
d
)
\varphi(n)=\sum_{d|n}d*\mu(\frac{n}{d})
φ(n)=∑d∣nd∗μ(dn)
同除
n
n
n得到
φ
(
n
)
n
=
∑
d
∣
n
μ
(
d
)
d
\frac{\varphi(n)}{n}=\sum_{d|n}\frac{\mu(d)}{d}
nφ(n)=∑d∣ndμ(d)
这有什么用吗??等到杜教筛狄利克雷卷积就很重要了,然而在这里不是重点
对了,一大重点就是两个积性函数的狄利克雷卷积仍然是一个积性函数,对于一个积性函数,可以分解质因数,分别处理每个质数及其指数的幂的答案再相乘
Bzoj 3601 一个人的数论
题目
已知 f d ( n ) f_d(n) fd(n)表示所有小于 n n n且与 n n n互质的正整数的 d d d次方的和,给出 n = ∏ i = 1 c n t p i c i n=\prod_{i=1}^{cnt}p_i^{c_i} n=∏i=1cntpici,和 d d d,求 f d ( n )   m o d   1000000007 f_d(n)\bmod 1000000007 fd(n)mod1000000007
分析
那么
f
d
(
n
)
=
∑
i
=
1
n
i
d
∗
[
g
c
d
(
n
,
i
)
=
=
1
]
f_d(n)=\sum_{i=1}^ni^d*[gcd(n,i)==1]
fd(n)=∑i=1nid∗[gcd(n,i)==1]
根据
∑
k
∣
n
μ
(
k
)
=
[
n
=
=
1
]
\sum_{k|n}\mu(k)=[n==1]
∑k∣nμ(k)=[n==1](非常有用)
得到
f
d
(
n
)
=
∑
i
=
1
n
i
d
∗
(
∑
k
∣
n
,
k
∣
i
μ
(
k
)
)
f_d(n)=\sum_{i=1}^ni^d*(\sum_{k|n,k|i}\mu(k))
fd(n)=i=1∑nid∗(k∣n,k∣i∑μ(k))
f
d
(
n
)
=
∑
k
∣
n
∑
i
=
1
n
[
k
∣
i
]
i
d
μ
(
k
)
f_d(n)=\sum_{k|n}\sum_{i=1}^n[k|i]i^d\mu(k)
fd(n)=k∣n∑i=1∑n[k∣i]idμ(k)
f
d
(
n
)
=
∑
k
∣
n
∑
i
=
1
⌊
n
k
⌋
(
k
i
)
d
μ
(
k
)
\large f_d(n)=\sum_{k|n}\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}(ki)^d\mu(k)
fd(n)=k∣n∑i=1∑⌊kn⌋(ki)dμ(k)
f
d
(
n
)
=
∑
k
∣
n
μ
(
k
)
k
d
∑
i
=
1
⌊
n
k
⌋
i
d
f_d(n)=\sum_{k|n}\mu(k)k^d\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}i^d
fd(n)=k∣n∑μ(k)kdi=1∑⌊kn⌋id
后面这个东西把它变成
s
(
n
)
s(n)
s(n),感性理解,是一个关于
n
n
n的
d
+
1
d+1
d+1次多项式,也就是可以表示成
∑
i
=
0
d
+
1
a
i
n
i
\sum_{i=0}^{d+1}a_in^i
∑i=0d+1aini,其中
a
i
a_i
ai可以高斯消元得到
那么
f
d
(
n
)
=
∑
i
=
0
d
+
1
a
i
∑
k
∣
n
μ
(
k
)
k
d
(
n
k
)
i
f_d(n)=\sum_{i=0}^{d+1}a_i\sum_{k|n}\mu(k)k^d(\frac{n}{k})^i
fd(n)=i=0∑d+1aik∣n∑μ(k)kd(kn)i
后面这坨变成了狄利克雷卷积,可以用积性函数解决
也就是若
g
(
k
)
=
∑
k
∣
n
μ
(
k
)
k
d
(
n
k
)
i
g(k)=\sum_{k|n}\mu(k)k^d(\frac{n}{k})^i
g(k)=∑k∣nμ(k)kd(kn)i
把
n
n
n质因数分解,分别求出单个质数的指数次幂的答案再相乘
g
(
p
t
)
=
∑
j
=
0
t
μ
(
p
j
)
p
d
j
p
(
t
−
j
)
i
g(p^t)=\sum_{j=0}^t\mu(p^j)p^{dj}p^{(t-j)i}
g(pt)=∑j=0tμ(pj)pdjp(t−j)i
因为
{
μ
(
p
0
)
=
1
μ
(
p
1
)
=
−
1
o
t
h
e
r
w
i
s
e
μ
(
p
t
)
=
0
\begin{cases}\mu(p^0)=1\\ \mu(p^1)=-1\\otherwise\mu(p^t)=0\end{cases}
⎩⎪⎨⎪⎧μ(p0)=1μ(p1)=−1otherwiseμ(pt)=0
所以
g
(
p
t
)
=
p
t
i
−
p
d
p
(
t
−
1
)
i
=
p
t
i
(
1
−
p
d
−
i
)
g(p^t)=p^{ti}-p^dp^{(t-1)i}=p^{ti}(1-p^{d-i})
g(pt)=pti−pdp(t−1)i=pti(1−pd−i)
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int mod=1000000007;
int b[1011][2],a[111][111],c[111],m,n,ans;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void swap(int &a,int &b){rr int t=a;a=b,b=t;}
inline signed ksm(int x,int y){
rr int ans=1;
for (;y;y>>=1,x=1ll*x*x%mod)
if (y&1) ans=1ll*ans*x%mod;
return ans;
}
inline void init(){
for (rr int i=0;i<m+2;++i){
a[i][0]=1;
for (rr int j=1;j<m+2;++j) a[i][j]=1ll*a[i][j-1]*(i+1)%mod;
a[i][m+2]=a[i][m]+(i>0?a[i-1][m+2]:0),a[i][m+2]-=mod*(a[i][m+2]>=mod);
}
for (rr int i=0;i<m+2;++i){
for (rr int j=i;j<m+2;++j) if (a[j][i])
for (rr int k=0;k<m+3;++k) swap(a[i][k],a[j][k]);
for (rr int j=0;j<m+2;++j) if (i!=j&&a[j][i]){
rr int elim=1ll*a[j][i]*ksm(a[i][i],mod-2)%mod;
for (rr int k=i;k<m+3;++k)
a[j][k]=a[j][k]-1ll*a[i][k]*elim%mod,a[j][k]+=mod*(a[j][k]<0);
}
}
for (rr int i=0;i<m+2;++i)
c[i]=1ll*a[i][m+2]*ksm(a[i][i],mod-2)%mod;
return;
}
signed main(){
m=iut(); n=iut(); init();
for (rr int i=1;i<=n;++i) b[i][0]=iut(),b[i][1]=iut();
for (rr int i=0;i<m+2;++i){
rr int mul=1;
for (rr int j=1;j<=n;++j)
mul=1ll*mul*ksm(b[j][0],1ll*b[j][1]*i%(mod-1))%mod,
mul=1ll*mul*(mod+1-ksm(b[j][0],m-i+(mod-1)*(m<i)))%mod;
mul=1ll*mul*c[i]%mod,ans=ans+mul-mod*(ans+mul>=mod);
}
return !printf("%d",ans+mod*(ans<0));
}
爱做不做
练习 |
---|
洛谷 2257 YY的GCD |
洛谷 3455 ZAP-Queries |
洛谷 4318 完全平方数 |
洛谷 2522 Problem B |
洛谷 3327 约数个数和 |
洛谷 1829 Crash的数字表格 |
洛谷 3312 数表 |
以下是黑题 |
洛谷 4466 和与积 |
洛谷 3704 数字表格 |
我的博客都写了题解
后续
参考于pengym的杜教筛