BZOJ 2005: [Noi2010]能量采集(莫比乌斯反演)
来源:互联网 发布:淘宝买家怎么实名认证 编辑:程序博客网 时间:2024/06/17 18:59
题目传送门
Solution
首先将题目转换,容易发现一个点
然后就变成了求
它等于
于是我们只需求
这是一个莫比乌斯反演的经典问题。
在解决这个问题之前,先来复习一下莫比乌斯反演的有关知识:
设
如何证明?下面引用LYW大神的证明:
倒数第二步如何推到最后一步呢?我们知道狄利克雷卷积的元函数
这是莫比乌斯函数的一个重要性质。
如何证明?
n=1明显成立。
其他情况把n分解质因数得到:
因为d是n的约数,那么d的所有质因数也只有p1到pk。
因为只要有一个质因数的指数大于1,μ(d)就是0,所以系数只可能是0或者1。
如果有r个质因子的指数是1,那么
在k个质因子中选出r个,所以d有
那么总的公式就是:
我们再乘上一个1,得到
观察最右边的公式,似乎和
这个公式形式相同。
所以
得到这个后,其实还有另一种证明前面的公式的方法,这里借用了狄利克雷卷积的一些变换(狄利克雷卷积的定义等省略)。
因为
到这里,我们简要复习了一下莫比乌斯反演。
回到题目(假设m
这里的做法类似于统计gcd为g的数对的数量。
然后开始变形:
原式=
令
到这里,引入第二条式子
这个证明就用
接下来:
大道至简。
在此之前,时间复杂度为
后来就是
然而多组数据时,我们要加上分块优化。就是将下底函数进行分组。
当我们计算
因为随着
然后对于
对于同样的
说了那么多,不如多熟记几条公式。以下必记:
我们可以直接使用上面的公式直接跳到中间的某步运算过程:
首先,设
因为
则根据公式得
即
而答案就等于
这里就到了“令
好了,就到这里了(数学公式敲到我快吐血)。
Code
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#define N 100010using namespace std;typedef long long LL;int n, m, cnt;bool vis[N];int prime[N];LL phi[N], sum[N];void Get_Phi(){ vis[1] = true; phi[1] = 1ll; for(int i = 2; i <= n; i++){ if(!vis[i]){ prime[++cnt] = i; phi[i] = i - 1; } for(int j = 1; j <= cnt && i * prime[j] <= n; j++){ vis[i * prime[j]] = true; if(i % prime[j] == 0){ phi[i * prime[j]] = phi[i] * prime[j]; break; } else phi[i * prime[j]] = phi[i] * (prime[j] - 1); } } sum[0] = 0ll; for(int i = 1; i <= n; i++) sum[i] = sum[i-1] + phi[i];}LL Get_Ans(){ LL res = 0ll; int last; for(int i = 1; i <= n; i = last+1){ last = min(n/(n/i), m/(m/i)); res += (LL)(n/i) * (LL)(m/i) * (sum[last] - sum[i-1]); } return res * 2 - (LL)n * (LL)m; }int main(){ freopen("bzoj2005.in", "r", stdin); freopen("bzoj2005.out", "w", stdout); scanf("%d%d", &n, &m); if(n > m) swap(n, m); Get_Phi(); printf("%lld\n", Get_Ans()); return 0;}
多希望我的人生是大梦一场,梦醒时分你依旧在我身旁。
- Bzoj 2005: [Noi2010]能量采集(莫比乌斯反演)
- BZOJ 2005 NOI2010 能量采集 莫比乌斯反演
- BZOJ 2005: [Noi2010]能量采集(莫比乌斯反演)
- bzoj 2005 [Noi2010]能量采集 O(n)莫比乌斯反演
- bzoj2005: [Noi2010]能量采集 莫比乌斯反演
- 【bzoj2005】[Noi2010]能量采集 莫比乌斯反演
- [BZOJ2005][NOI2010]能量采集(莫比乌斯反演)
- [bzoj2005][莫比乌斯反演][Noi2010]能量采集
- [BZOJ2005][NOI2010]能量采集(莫比乌斯反演)
- BZOJ 2005 能量采集(莫比乌斯反演)
- bzoj 2005 能量采集 莫比乌斯反演
- bzoj 2005 能量采集(莫比乌斯反演)
- BZOJ 2005-能量采集(莫比乌斯反演)
- 【BZOJ2005】【NOI2010】能量采集(莫比乌斯反演,容斥原理)
- BZOJ 2005 能量采集(莫比乌斯反演+分块)
- BZOJ 2005 [Noi2010]能量采集
- BZOJ 2005: [Noi2010]能量采集
- bzoj 2005: [Noi2010] 能量采集
- 酒客项目日志20170804
- html如何给文字添加背景底色
- 欢迎使用CSDN-markdown编辑器
- [PKU暑课笔记] 广度优先搜索BFS POJ3278抓住那头牛 POJ3984迷宫问题
- HDU 1709 The Balance(母函数)
- BZOJ 2005: [Noi2010]能量采集(莫比乌斯反演)
- opencv实现图片与视频中的人脸检测
- 给一个字符串,有大小写字母,要求写一个函数把小写字母放在前面 大写字母放在后面,尽量使用最小空间,时间复杂度。(即用指针做)。 如:aAbBcCdD ---àabcdABCD
- DOM0级监听和2级监听
- zabbix2.4监控windows客户端
- A
- 求地球经纬度间距
- (Windows)Python用压缩包方法安装Numpy和MatplotLib
- c语言实现继承和多态