预备知识:
- a|n表示a是n的一个因子
-
μ(d)为莫比乌斯函数
- 若 d=1 ,则 μ(d)=1 ;
- 若 d=p1p2p3⋯pk , pi 为互异素数,则有 μ(d)=(−1)k ;
- 其他情况下 μ(d)=0 ;
算法内容:
已知:
则:
证明:
首先,证明对于任意正整数 n 有:
- 当 n=1 时,显然成立。
- 当
n≠1
时,将
n
分解为
n=pa11pa22pa33pakk 。
在
n
的所有因子中, 只有当所有质因子的次数都为1 ,
μ()
的函数值才不为
0
,我们枚举n的所有因子,这些因子是由质因子p 组合而成,而使用r个质因子组合而成的因子个数有
Crk
个,再乘上
μ()
函数,有:
根据二项式定理:
代入 x=−1,y=1 得:
于是证得:
莫比乌斯反演定理推导:
②式是由已知推得。这里重点理解一下③式。
在这之前值得注意的是:因为
k
是nd 的一个因子,所以存在一个整数
p
使得p⋅k⋅d=n ,故
nd
和
nk
的效果是一样的。
这时再讨论③式,则变成一个等式左边和等式右边交换了求和上限的问题。这两个式子是先求和再乘,而不是先乘再求和至于为什么相等,我们可以用代码的形式来解释,这样更直观:
int ans = 0;
for (int i = 1; i < a; ++a)
{
for (int j = 5; j < b; j += 2)
{
ans += i * j;
}
}
//another verison
ans = 0;
for (int i = 5; i < b; ++i)
{
for (int j = 1; j < a; ++j)
{
ans += i * j;
}
}
我们可以发现,交换两层循环,最后ans的值是不变的。故他们交换求和上限是相等的。
对于③式,由①式可知:当且仅当 bk=1 时
故:
故:
至此,莫比乌斯反演证明完毕。
题目:TrickGCD(HDU6053)
Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 2443 Accepted Submission(s): 935Problem Description
You are given an array A , and Zhu wants to know there are how many different array B satisfy the following conditions?
- 1≤Bi≤Ai
- For each pair( l , r ) (1≤l≤r≤n) , gcd(bl,bl+1…br)≥2
Input
The first line is an integer T(1≤T≤10) describe the number of test cases.Each test case begins with an integer number n describe the size of array A.
Then a line contains n numbers describe each element of A
You can assume that 1≤n,Ai≤105
Output
For the kth test case , first output “Case #k: ” , then output an integer as answer in a single line . because the answer may be large , so you are only need to output answer mod 109+7Sample Input
1
4
4 4 4 4Sample Output
Case #1: 17
题意:
已知数组A,要求一个数组B。其中数组B需要满足的条件有:
- 1≤Bi≤Ai
- 对于任意一对 (l,r) , gcd(bi,bi+1,bi+2,⋯,br)≥2
由样例我们想到,凡是2的倍数一定符合条件、3的倍数也符合条件,于是我们自然想到求出 2−min(A) 的倍数的个数,然后相乘相加。
但是再想一层,有重复计算。故用简单的容斥定理奇加偶减来进行去重。
重点在于如何判断是奇是偶呢?这时候用到了莫比乌斯函数,最后推得
感想:
这里有一个有关线性筛的想法。大家都在想,比如从1到12,为什么有的数是加,有的数是减,有的数系数是 μ(x)=0 。这里提几点:
- 质数只能由它本身得到
- 合数可以分解为一个最小素因子 p <script type="math/tex" id="MathJax-Element-47">p</script>和另一个数乘积的形式
- 如果一个数质因子分解后,全是互异素数,则这个数只能由这些互异素数相乘得到