原文:http://blog.csdn.net/skywalkert/article/details/50500009
以下是本人整理~
常用公式:
①
∑d|nφ(n)=n→φ(n)=n−∑d|n,d<nφ(d)
②
∑ni=1[gcd(n,i)=1]∗i=n∗φ(n)+[n=1]2
③
[n=1]=∑d|nμ(d)
④
n=∑d|nφ(d)
⑤
若
S(n)=∑ni=1ϕ(i)
则
S(n)=n∗(n+1)2−∑ni=2S(⌊ni⌋)
⑥
若
S(n)=∑ni=1i∗ϕ(i)
则
S(n)=n∗(n+1)∗(2n+1)6−∑ni=2i∗S(⌊ni⌋)
⑦
若
S(n)=∑ni=1μ(i)
则
S(n)=1−∑ni=2S(⌊ni⌋)
⑧
若
S(n)=∑ni=1i∗μ(i)
则
S(n)=1−∑ni=2S(⌊ni⌋)
一些函数定义:
元函数
e(n)=[n=1]
,狄利克雷卷积的乘法单位元,完全积性。
恒等函数
I(n)=1
,完全积性。
单位函数
id(n)=n
,完全积性。
幂函数
idk(n)=nk
,完全积性。
积性函数的定义
1.若
f(n)
的定义域为正整数域,值域为复数,即
f:Z+→C
,则称
f(n)
为数论函数(
I
为数论函数集合)。
2.若
3.若
f(n)
为积性函数,且对于任意正整数
p,q
都有
f(p⋅q)=f(p)⋅f(q)
,则称其为完全积性函数。
积性函数的性质与例子
σk(n)=∑d|ndk
,表示n的约数的k次幂和
特殊:约数个数
k=0
,约数和
k=1
欧拉函数:
φ(n)=∑ni=1[(n,i)=1]=∏ki=1(1−1pi)
∑d|nφ(n)=n→φ(n)=n−∑d|n,d<nφ(d)
表示不大于n且与n互质的正整数个数(n>2时φ(n)为偶数)
∑ni=1[gcd(n,i)=1]∗i=n∗φ(n)+[n=1]2
表示不大于n且与n互质的正整数总和
莫比乌斯函数:
μ(n)={(−1)t n=∏ti=1pi0 有平方因子
莫比乌斯经典公式:
[n=1]=∑d|nμ(d)
排列组合后二项式定理转换即可证明
n=∑d|nφ(d)
将
in(1≤i≤n)
化为最简分数统计个数即可证明
若
f(n)
为积性函数,对于
n=∏ti=1pkii
则:
f(n)=∏ti=1f(pkii)
若
f(n)
为完全积性函数,对于
n=∏ti=1pkii
则:
f(n)=∏ti=1f(pi)ki
狄利克雷卷积与莫比乌斯反演
一、
数论函数
f
和
狄利克雷卷积满足交换律、结合律,对加法满足分配律。
存在单位元函数
e(n)=[n=1]
使得
f∗e=f=e∗f
。
若
f
和
二、
狄利克雷卷积的一个常用技巧是对于积性函数
f
与恒等函数
已知
n=∏ti=1pkii
若
g(n)=∑d|nf(d)
则
g(n)=∏ti=1∑kij=0f(pji)
三、
莫比乌斯反演也是对于
g(n)=∑d|nf(d)
的讨论。
☆但是不要求
f
是积性函数☆(适用于已知
f(n)=∑d|ng(d)⋅μ(nd)
证明:
∵
I∗μ=e
∴
g∗μ=f∗I∗μ=f∗e=f
欧拉函数和莫比乌斯函数之间的关系
∵
∑d|nφ(d)=id(n)
∴
φ(n)=∑d|nμ(d)nd
∴
φ(n)n=∑d|nμ(d)d
杜教筛
一个简单的例子:
求前n个正整数的约数之和,即
∑ni=1σ(i)
其中
n≤1012
推导:
∑ni=1σ(i)=∑ni=1∑nj=1[j|i]∗j=∑ni=1i∗∑nj=1[i|j]=∑ni=1i∗⌊ni⌋
当
i≤n√
时
⌊ni⌋
只有
n√
个值
当
i≤n√
时
∵
⌊ni⌋≤n√
∴
⌊ni⌋
只有
n√
个值
对于固定的
⌊ni⌋
,
i
的取值是一段连续的区间,是
练习:求前n个正整数的约数个数之和
∑ni=1i∗⌊ni⌋=∑ni=1⌊ni⌋∗(⌊ni⌋+1)2
(一个常见的表达形式)
另一个例子:
求前n个正整数的欧拉函数之和,即
∑ni=1φ(i)
,其中
n≤1011
推导:
我们利用
∑d|nφ(n)=n
来化简。
它的另一个形式:
φ(n)=n−∑d|n,d<nφ(d)
记
ϕ(n)=∑ni=1φ(i)
那么:
其中
它的思想所在就是:d的条件是要能整除i,无法方便算出。于是我们便枚举 di 的值,这样这些值就是连续的一坨一坨的了。
时间复杂度证明:
小总结:
如果能通过狄利克雷卷积构造一个更好计算前缀和的函数,且用于卷积的另一个函数也易计算,则可以简化计算过程。例如上题就是利用了φ∗I=id的性质,但一定注意,不是所有的这一类题都只用配个恒等函数I就可以轻松完事的,有时需要更细致的观察。
先根据要求的函数的一些其他表达式进行简化,将简化出来的式子或原式整体感知一下(明白它在求什么),尝试从其他方式考虑(目标就是降低复杂度,那么就要观察枚举的那些数那些比较小,那些数比较有特性之类的)
杜教筛通式:
我们要求的是
S(n)=∑ni−1f(i)
,其中
f∈I
假设
g∈I
且
g(1)≠0
那么
即
∴
如果我们能知道 g 和
大白话口胡:
上面的函数
g
是我们xjb选的一个数论函数。若
假设 g(1)A,∑ni=1(f∗g)(i)=B
AS(n)=B−∑ni=2g(i)S(⌊ni⌋)
(能求的前提是g(i)可以快速知道的哦~)
一坨题
1.求前n个正整数的约数之和。
∑ni=1σ1(i)
√见上
2.求前n个正整数的约数个数之和。
∑ni=1σ0(i)
√
3.求前n个正整数的欧拉函数之和。
∑ni=1φ(i)
√见上
4.求前n个正整数的μ值之和。
∑ni=1μ(i)
√
5.令
A(n)=∑ni=1i(n,i),F(n)=∑ni=1A(i)
,求
F(n)
6.若
n=∏ti=1pkii
则
rad(n)=∏ti=1pi
求
∑ni=1∑d|nrad(d)∗φ(drad(d))
7.求 ∑ni=1∑nj=1lcm(i,j) √
8.求 ∑ni=1∑nj=1gcd(i,j) √
9.求 S(n)=∑ni=1i∗ϕ(i) √
10.求 ∑ni=1∑ij=1lcm(i,j)i √
11.求 ∑ni=1∑mj=1lcm(i,j) √
一坨解法
2.求前n个正整数的约数个数之和。
∑ni=1σ0(i)
4.求前n个正整数的μ值之和。 S(n)=∑ni=1μ(i)
∴ S(n)=1−∑ni=2S(⌊ni⌋)
7.求 ∑ni=1∑nj=1lcm(i,j)
∵
∴
令
∵
∴
∴
8.求
∑ni=1∑nj=1gcd(i,j)
转换为问题3
9.求
S(n)=∑ni=1i∗ϕ(i)
10.求
∑ni=1∑ij=1lcm(i,j)i
11.求
∑ni=1∑mj=1lcm(i,j)
不妨设
n≤m
令 F(x,y)=∑xi=1∑yj=1ij∗[gcd(i,j)=1]
∴
分析 F(x,y)
代入原式:
预处理以后分块套分块。也可以不预处理,之间分块套分块套杜教筛
//问题4----51nod1244
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int N=100100;
int p[N],v[N],mu[N],tot;
ll l,r,ans,sum[N];
map<ll,ll> mp;
ll gao(ll n){
if (n<N) return sum[n];
if (mp.find(n)!=mp.end()) return mp[n];
ll res=1,i,nx;
for (i=2;i<=n;i=nx+1){
nx=n/(n/i);
res=res-(nx-i+1)*gao(n/i);
}
return mp[n]=res;
}
void pre(){
for (int i=2;i<N;i++){
if (!v[i]) p[++tot]=i,mu[i]=-1;
for (int j=1;j<=tot && i*p[j]<N;j++){
v[i*p[j]]=1;
if (i%p[j]==0) break;
mu[i*p[j]]=-mu[i];
}
}
mu[1]=1;
for (int i=1;i<N;i++)
sum[i]+=sum[i-1]+mu[i];
}
int main(){
freopen("d.in","r",stdin);
scanf("%lld%lld",&l,&r);pre();
printf("%lld\n",gao(r)-gao(l-1));
}