洛谷P3327 [SDOI2015]约数个数和 【莫比乌斯反演】
题目
设d(x)为x的约数个数,给定N、M,求\(\sum_{i = 1}^{N} \sum_{j = 1}^{M} d(ij)\)
输入格式
输入文件包含多组测试数据。第一行,一个整数T,表示测试数据的组数。接下来的T行,每行两个整数N、M。
输出格式
T行,每行一个整数,表示你所求的答案。
输入样例
2
7 4
5 6
输出样例
110
121
提示
1<=N, M<=50000
1<=T<=50000
题解
好神的题【是我太弱吧】
首先上来就伤结论。。
题目所求
\]
有一个这样的结论:
\]
那么就转化为了:
\]
我们考虑对于每一对互质的x、y,x会被枚举\(\lfloor \frac{N}{x} \rfloor\)次,y会被枚举\(\lfloor \frac{M}{y} \rfloor\)次
所以有
\]
那么可以进行莫比乌斯反演了
令
\]
\]
那么有
F(d) &= (\sum_{i = 1}^{N}\lfloor \frac{N}{i} \rfloor) * (\sum_{j = 1}^{M} \lfloor \frac{M}{j} \rfloor) [d | gcd(i,j)] \\
&= (\sum_{i = 1}^{\lfloor \frac{N}{d} \rfloor}\lfloor \frac{N}{id} \rfloor) * (\sum_{j = 1}^{\lfloor \frac{M}{d} \rfloor} \lfloor \frac{M}{jd} \rfloor) \\
&= (\sum_{i = 1}^{\lfloor \frac{N}{d} \rfloor}\lfloor \frac{\lfloor \frac{N}{d} \rfloor}{i} \rfloor) * (\sum_{j = 1}^{\lfloor \frac{M}{d} \rfloor} \lfloor \frac{\lfloor \frac{M}{d} \rfloor}{j} \rfloor)
\end{aligned}
\]
其中\(\sum_{i = 1}^{N}\lfloor \frac{N}{i} \rfloor\)可以\(O(n\sqrt{n})\)预处理出,我们记为\(sum(n)\)
那么
\]
\]
分块计算
复杂度\(O(T\sqrt{N} + N\sqrt{N})\)
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 50005,maxm = 100005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = (out << 3) + (out << 1) + c - '0'; c = getchar();}
return out * flag;
}
int prime[maxn],primei,mu[maxn],isn[maxn];
LL sum[maxn];
void init(){
mu[1] = 1;
for (int i = 2; i < maxn; i++){
if (!isn[i]) prime[++primei] = i,mu[i] = -1;
for (int j = 1; j <= primei && i * prime[j] < maxn; j++){
isn[i * prime[j]] = true;
if (i % prime[j] == 0){mu[i * prime[j]] = 0; break;}
mu[i * prime[j]] = -mu[i];
}
}
for (int i = 1; i < maxn; i++) mu[i] += mu[i - 1];
for (int n = 1,nxt; n <= 50000; n++){
for (int i = 1; i <= n; i = nxt + 1){
nxt = n / (n / i);
sum[n] += (LL)(nxt - i + 1) * (n / i);
}
}
}
int main(){
init();
int T = read(),n,m;
while (T--){
n = read(); m = read();
if (n > m) swap(n,m);
LL ans = 0; int nxt;
for (int i = 1; i <= n; i = nxt + 1){
nxt = min(n / (n / i),m / (m / i));
ans += sum[n / i] * sum[m / i] * (mu[nxt] - mu[i - 1]);
}
printf("%lld\n",ans);
}
return 0;
}
洛谷P3327 [SDOI2015]约数个数和 【莫比乌斯反演】的更多相关文章
- 洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)
题目描述 设d(x)为x的约数个数,给定N.M,求 \sum^N_{i=1}\sum^M_{j=1}d(ij)∑i=1N∑j=1Md(ij) 输入输出格式 输入格式: 输入文件包含多组测试数据.第 ...
- P3327 [SDOI2015]约数个数和 莫比乌斯反演
P3327 [SDOI2015]约数个数和 莫比乌斯反演 链接 luogu 思路 第一个式子我也不会,luogu有个证明,自己感悟吧. \[d(ij)=\sum\limits_{x|i}\sum\li ...
- 洛谷P3327 - [SDOI2015]约数个数和
Portal Description 共\(T(T\leq5\times10^4)\)组数据.给出\(n,m(n,m\leq5\times10^4)\),求\[\sum_{i=1}^n\sum_{j= ...
- 洛谷 P3327 [SDOI2015]约数个数和 || Number Challenge Codeforces - 235E
https://www.luogu.org/problemnew/show/P3327 不会做. 去搜题解...为什么题解都用了一个奇怪的公式?太奇怪了啊... 公式是这样的: $d(xy)=\sum ...
- luogu P3327 [SDOI2015]约数个数和 莫比乌斯反演
题面 我的做法基于以下两个公式: \[[n=1]=\sum_{d|n}\mu(d)\] \[\sigma_0(i*j)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]\] 其中\(\ ...
- 洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)
传送门 公式太长了……我就直接抄一下这位大佬好了……实在懒得打了 首先据说$d(ij)$有个性质$$d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]$$ 我们所求的答案为$ ...
- 【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演
[BZOJ3994][SDOI2015]约数个数和 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组 ...
- [BZOI 3994] [SDOI2015]约数个数和(莫比乌斯反演+数论分块)
[BZOI 3994] [SDOI2015]约数个数和 题面 设d(x)为x的约数个数,给定N.M,求\(\sum _{i=1}^n \sum_{i=1}^m d(i \times j)\) T组询问 ...
- LOJ #2185 / 洛谷 P3329 - [SDOI2015]约数个数和(莫比乌斯函数)
LOJ 题面传送门 / 洛谷题面传送门 题意: 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^md(ij)\),\(d(x)\) 为 \(x\) 的约数个数. \( ...
随机推荐
- [课堂总结]C++课堂总结(二)
近期的面向对象程序设计的不容易记忆或者理解的东西进行一个总结,以后忘记了可以常来看下,C++是个很重要的东西,很多领域都用得到,加油,特种兵! 浅拷贝构造.深拷贝构造 浅拷贝构造是系统默认的拷贝构造函 ...
- SQL Server将列以分隔符分割后存到临时表
begin if object_id('tempdb..#t') is not null drop table #t; create table #t ( filepath ) ); declare ...
- Spring中c3p0连接池 jar包下载 c3p0-0.9.2.1 jar包和mchange-commons-java-0.2.3.4 jar 包
c3p0-0.9.2.1 jar包和mchange-commons-java-0.2.3.4 jar 包 下载地址: https://pan.baidu.com/s/1jHDiR7g 密码 tyek
- fiddler 模拟发送post请求
打开fiddler,选择在右边的Composer工具栏,打开Parsed选项,然后数据发送协议,例如选择POST, POST右边输入框可以输入访问地址, 下方的输入框可以输入发送的输入操作,例如发送的 ...
- 如何用纯 CSS 创作一副国际象棋
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/WyXrjz 可交互视频 ...
- Tcl/Cmds
- 解决linux不能解压rar格式压缩包
1download rarlinux-x64-5.3.0.tar.gz data package 2.tar xvf rarlinux-64-5.3.0.tar.gz 3. cd rar and th ...
- verilog $fopen 函数的小缺陷
system task $fopen 的argument 为1.文件名字(可以包含具体的文件路径但是注意用)2.打开方式比如"r"."w"."a&qu ...
- linux下的一些命令分析与shell的一些命令
对> 与 >>的理解 echo "aaa" > aaa.txt 这个是在aaa.txt中写入aaa 可以用cat aaa.txt查看 echo &qu ...
- Python基础——异常
捕捉所有异常 for i in range(10): try: input_number=input('write a number') if input_number=='q': break res ...