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= ...
随机推荐
- js中 函数声明/函数表达式/匿名函数/箭头函数/立即执行函数
函数声明: function add(a, b) { // ... } 1.顾名思义,声明一个函数, 用关键字 “function” 来告诉,这是一个函数. 2.任何地方,想用就可以拿过来使用 函数表 ...
- vue-cli创建第一个项目(用git bash解决上下键移动选择问题)
我电脑是windows:(nodejs已经有了) 1 下载vue-cli cmd 打开命令行,或者是gitbash.最好是用cnpm比较快. 2 创建项目: dos命令,cd 你的希望创建的文件夹 ...
- 构建一个可以统计 qps 的nginx服务的Dockerfile
github 项目地址: https://github.com/SilentCC/nginx_lua_qps_count nginx 是经常会用到的web 服务器,它有出色的并发性能,因此尝尝被用来当 ...
- 切分 拆分集合list的方式
一般有两种,第一是sublist(),代码冗余效率低: 第二种: 引包自 com.google.common.collect.Lists 话不多说直接上实例: List<ContractMode ...
- pytorch 中的重要模块化接口nn.Module
torch.nn 是专门为神经网络设计的模块化接口,nn构建于autgrad之上,可以用来定义和运行神经网络 nn.Module 是nn中重要的类,包含网络各层的定义,以及forward方法 对于自己 ...
- nginx基本用法和HTTPS配置
nginx作用讲解:1.反向代理:需要多个程序共享80端口的时候就需要用到反向代理,nginx是反向代理的一种实现方式.2.静态资源管理:一般使用nginx做反向代理的同时,应该把静态资源交由ngin ...
- mybatis+oracle实现简单的模糊查询
第一种 concat select * from cat_table where cat_name like concat(#{catName},'%') --单个百分号 select * from ...
- 解决HTML5提出的新的元素不被IE6-8识别的解决办法
解决HTML5提出的新的元素不被IE6-8识别的解决办法 <!--[if lt IE 9]> <script type="text/javascript" src ...
- 如何知道网页浏览器cookie是什么?
一直有网友问网页cookie如何获取,其实想知道自己访问网页时的cookie没那么难,用Chrome内核浏览器的debug功能就能看到,怎么查看呢?随ytkah一起来看看吧! 打开网页,按F12键,选 ...
- Tomcat服务安全加固
Tomcat服务默认启用了管理后台功能,使用该后台可直接上传 war 文件包对站点进行部署和管理.由于运维人员的疏忽,可能导致管理后台存在空口令或者弱口令的漏洞,使得黑客或者不法分子可以利用该漏洞直接 ...