原文: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.若f(n)为数论函数,且 f(1)=1 ,对于互质的正整数 p,q 有 f(p⋅q)=f(p)⋅f(q) ,则称其为积性函数。
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 和g狄利克雷卷积定义为 (f∗g)(n)=∑d|nf(d)⋅g(nd) 。
狄利克雷卷积满足交换律、结合律,对加法满足分配律。
存在单位元函数 e(n)=[n=1] 使得 f∗e=f=e∗f 。
若 f 和g为积性函数则 f∗g 也为积性函数。
二、
狄利克雷卷积的一个常用技巧是对于积性函数 f 与恒等函数I的卷积的处理。比如:
已知 n=∏ti=1pkii
若 g(n)=∑d|nf(d)
则 g(n)=∏ti=1∑kij=0f(pji)
三、
莫比乌斯反演也是对于 g(n)=∑d|nf(d) 的讨论。
☆但是不要求 f 是积性函数☆(适用于已知g(n)求 f(n) 的情况)
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⌋+1⌋+1,⌊n⌊ni⌋⌋]
练习:求前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)
那么:
小总结:
如果能通过狄利克雷卷积构造一个更好计算前缀和的函数,且用于卷积的另一个函数也易计算,则可以简化计算过程。例如上题就是利用了φ∗I=id的性质,但一定注意,不是所有的这一类题都只用配个恒等函数I就可以轻松完事的,有时需要更细致的观察。
先根据要求的函数的一些其他表达式进行简化,将简化出来的式子或原式整体感知一下(明白它在求什么),尝试从其他方式考虑(目标就是降低复杂度,那么就要观察枚举的那些数那些比较小,那些数比较有特性之类的)
杜教筛通式:
我们要求的是 S(n)=∑ni−1f(i) ,其中 f∈I
假设 g∈I 且 g(1)≠0 那么
大白话口胡:
上面的函数 g 是我们xjb选的一个数论函数。若∑ni=1(f∗g)(i)是一个定值时且g(1)≠0那么:
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)
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)
不妨设 n≤m
//问题4----51nod1244
#include
#include
#include
#include
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 mp;
ll gao(ll n){
if (nreturn 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;iif (!v[i]) p[++tot]=i,mu[i]=-1;
for (int j=1;j<=tot && i*p[j]1;
if (i%p[j]==0) break;
mu[i*p[j]]=-mu[i];
}
}
mu[1]=1;
for (int i=1;i1]+mu[i];
}
int main(){
freopen("d.in","r",stdin);
scanf("%lld%lld",&l,&r);pre();
printf("%lld\n",gao(r)-gao(l-1));
}