hdu 5382 GCD?LCM! - 莫比乌斯反演
题目传送门
题目大意
设$F(n) = \sum_{i = 1}^{n}\sum_{j = 1}^{n}\left [ [i, j] + (i, j) \geqslant n \right ]$,求$\sum_{i = 1}^{n} F(i)$。
考虑设$f(n) = \sum_{i = 1}^{n}\sum_{i = 1}^{n}\left[ \left[i,j \right ] + (i, j) = n \right ]$,那么有$F(n) = F(n - 1) - f(n - 1) + 2n - 1$。(因为$[i, n]\geqslant n$)
显然$[i, j] = k(i, j)$,那么我们可以枚举最大公约数。
$f(n)=\sum_{d \mid n}\sum_{i = 1}^{n}\sum_{j = 1}^{n}[(i, j) = 1][[id, jd] +d = n]\\=\sum_{d \mid n}\sum_{i = 1}^{n}\sum_{j = 1}^{n}[(i, j) = 1][ijd +d = n]\\=\sum_{d\mid n}\sum_{id | (n - d)}[(i, \frac{n - d}{di}) = 1]$
然后就是套路了。
$f(n)=\sum_{d\mid n}\sum_{id | (n - d)}[(i, \frac{n - d}{di}) = 1]\\=\sum_{d|n}\sum_{id|(n-d)}\sum_{e|i \wedge edi\mid (n - d)}\mu(e)\\=\sum_{d|n}\sum_{de|(n - d)}\mu(e)\left( \sum_{e|i\wedge ide\mid(n - d)}1\right )\\=\sum_{d|n}\sum_{e^2d|(n - d)}\mu(e)\sigma_0\left(\frac{n-d}{e^2d}\right)$
设$g(n) = \sum_{e^2|n}\mu(e)\sigma_0(\frac{n}{e^2})$,显然$g(n)$是可以$O(n\log n)$预处理的。考虑$i$在$1, 2,\cdots, n$中作为$\left \lfloor \frac{n}{i} \right \rfloor$个数的因子,然后枚举的总的因子的个数就是一个调和级数的和。对于$f(n)$也可以这样处理。然后就过了。
Code
/**
* hdu
* Problem#5382
* Accepted
* Time: 655ms
* Memory: 33992k
*/
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <ctime>
using namespace std;
typedef bool boolean; const int N = 1e6 + , M = ; int add(int a, int b) {
a += b;
if (a < )
a += M;
if (a >= M)
a -= M;
return a;
} int T, n;
int f[N], F[N], S[N];
int sl[N], mp[N], mu[N];
int rou[N], g[N];
boolean vis[N];
int num, pri[]; int tp;
int fac[]; void dfs(int x, int d) {
if (x == ) {
fac[tp++] = d;
return;
}
int p = mp[x], link = sl[x];
dfs(sl[x], d);
while (!(x % p))
x /= p, d *= p, dfs(link, d);
} void dfs1(int x, int d) {
if (x == ) {
fac[tp++] = d;
return;
}
int p = mp[x], a = ;
while (!(x % p))
x /= p, a++;
a = a >> ;
for (int i = , pro = ; i <= a; i++, pro = pro * p)
dfs1(x, pro * d);
} inline void prepare() {
mu[] = , rou[] = ;
for (int i = ; i < N; i++) {
if (!vis[i])
pri[num++] = mp[i] = i, mu[i] = -, rou[i] = , sl[i] = ;
for (int j = , x; j < num && pri[j] * i < N; j++) {
x = pri[j] * i, vis[x] = true;
if (i % pri[j])
mu[x] = -mu[i], mp[x] = pri[j], sl[x] = i, rou[x] = rou[i] << ;
else {
mu[x] = , mp[x] = pri[j], sl[x] = sl[i], rou[x] = rou[x / pri[j]] + rou[sl[x]];
break;
}
}
} g[] = ;
for (int i = ; i < N; i++) {
tp = , dfs1(i, );
for (int j = , x, d; j < tp; j++) {
x = fac[j];
d = i / x / x;
if (d * x * x == i)
g[i] = add(g[i], mu[x] * rou[i / x / x]);
}
} f[] = ;
int cnt = ;
for (int i = ; i < N; i++) {
tp = , dfs(i, );
cnt += tp;
for (int j = , x; j < tp; j++) {
x = fac[j];
f[i] = add(f[i], g[(i - x) / x]);
}
} F[] = ;
for (int i = ; i < N; i++)
F[i] = add(add(F[i - ], -f[i - ]), * i - );
S[] = ;
for (int i = ; i < N; i++)
S[i] = add(S[i - ], F[i]);
} inline void solve() {
scanf("%d", &n);
printf("%d\n", S[n]);
} int main() {
prepare();
scanf("%d", &T);
while (T--)
solve();
return ;
}
hdu 5382 GCD?LCM! - 莫比乌斯反演的更多相关文章
- HDU 1695 GCD (莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 1695 GCD (莫比乌斯反演模板)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- hdu 1695: GCD 【莫比乌斯反演】
题目链接 这题求[1,n],[1,m]gcd为k的对数.而且没有顺序. 设F(n)为公约数为n的组数个数 f(n)为最大公约数为n的组数个数 然后在纸上手动验一下F(n)和f(n)的关系,直接套公式就 ...
- 2015多校第8场 HDU 5382 GCD?LCM! 数论公式推导
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5382 题意:函数lcm(a,b):求两整数a,b的最小公倍数:函数gcd(a,b):求两整数a,b的最 ...
- hdu 1695 GCD(莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 5382 GCD?LCM!
先考虑化简f函数 发现,f函数可以写成一个递归式,化简后可以先递推求出所有f函数的值, 所以可以先求出所有S函数的值,对于询问,O(1)回答 代码: //File Name: hdu5382.cpp ...
- 【BZOJ2820】YY的GCD(莫比乌斯反演)
[BZOJ2820]YY的GCD(莫比乌斯反演) 题面 讨厌权限题!!!提供洛谷题面 题解 单次询问\(O(n)\)是做过的一模一样的题目 但是现在很显然不行了, 于是继续推 \[ans=\sum_{ ...
- 【BZOJ2818】Gcd(莫比乌斯反演)
[BZOJ2818]Gcd(莫比乌斯反演) 题面 Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Ou ...
- 【HDU1695】GCD(莫比乌斯反演)
[HDU1695]GCD(莫比乌斯反演) 题面 题目大意 求\(a<=x<=b,c<=y<=d\) 且\(gcd(x,y)=k\)的无序数对的个数 其中,你可以假定\(a=c= ...
随机推荐
- MQTT 嵌入式端通讯协议解析(转)
MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的oneNet.百度的云平台也都支持MQTT的接入.虽然MQTT很火,但是目前对 ...
- unicode 与 utf-8 编码概念及区别
unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案.每个字符都对应一个编号,编号的范围是0-0x10FFFF来.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为 ...
- Java模版方法的另一种实现
面试荔枝FM杯具,遂死磕AQS途中发现一个有趣的模版用法,记下来. 模版方法是很重要的设计模式,在数据访问层.众多的插件接口都可见其影子,一般的实现都是在模版中定义抽象方法并使用其方法进行算法,让具体 ...
- mui 轮播
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- div加链接 html给div加超链接实现点击div跳转的方法[申明:来源于网络]
div加链接 html给div加超链接实现点击div跳转的方法[申明:来源于网络] 地址:http://www.cdxwcx.com/faq/htmldivLink.html
- To be better —msup荣获平安科技“2018年度优秀合作伙伴”称号
2018年12月4日,平安科技在深圳平安金融中心举办了“2018年平安科技优秀培训合作伙伴交流会”,msup收到了邀请参与此次评选,并从80余家合作伙伴中脱颖而出,在交付量.满意度.师资内容.服务水准 ...
- Ubuntu 18.04安装JDK并配置环境变量
1.官网下载jdk 下载链接 http://www.oracle.com/technetwork/java/javase/downloads/index.html 可以根据自己的系统进行下载 2.进行 ...
- Spring Enable* 注解
Spring提供了一系列以Enable开头的注解,这些注解本质上是激活Spring的某些管理功能.比如,EnableWebMvc. 这个注解引入了MVC框架在Spring 应用中需要用到的所有bean ...
- RGBA与Opacity
rgba(r,g,b,a) 都与透明度有关,rgba不会影响文字,opacity则会.
- Python解析Linux命令行
写了个python脚本在linux需要传入参数使用,python参数传入有几个方法, 先用了Python中命令行参数的最传统的方法sys.argv linux cmd ~& python ma ...