【BZOJ3994】约数个数和(莫比乌斯反演)

题面

求$$\sum_{i=1}n\sum_{j=1}md(ij)$$

多组数据\((<=50000组)\)

\(n,m<=50000\)

其中\(d(x)\)是\(x\)的约数个数

题解

orz ZSY 巨佬

根据玄学(我也不知道为什么)的公式

\[d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)==1]
\]

所以,所求等于

\[\sum_{i=1}^n\sum_{j=1}^m\sum_{u|i}\sum_{v|j}[gcd(u,v)==1]
\]

把枚举因数丢到前面去

\[\sum_{u=1}^n\sum_{v=1}^m[\frac{n}{u}][\frac{m}{v}][gcd(u,v)==1]
\]

\(u,v\)看起来很不爽

\[\sum_{i=1}^n\sum_{j=1}^m[\frac{n}{i}][\frac{m}{j}][gcd(i,j)==1]
\]

看起来可以莫比乌斯反演一波了

\[f(x)=\sum_{i=1}^n\sum_{j=1}^m[\frac{n}{i}][\frac{m}{j}][gcd(i,j)==x]
\]

\[g(x)=\sum_{x|d}f(d)
\]

所以

\[g(x)=\sum_{i=1}^n\sum_{j=1}^m[\frac{n}{i}][\frac{m}{j}][x|gcd(i,j)]
\]

把\(x\)提出去,忽略\(gcd\)的影响

\[g(x)=\sum_{i=1}^{\frac{n}{x}}\sum_{j=1}^{\frac{m}{x}}[\frac{n}{ix}][\frac{m}{jx}]
\]

预处理出\(\sum_{i=1}^n[\frac{n}{i}]\)的值\(g(x)\)就可以\(O(1)\)算

预处理的方式,请参考一道水题约数研究

你就会知道这个玩意的值就是每个数约数个数的前缀和

因为一个数的约数个数是积性函数,可以线性筛

所以这个可以\(O(n)\)预处理

接下来的东西就比较好算了

所求就是\(f(1)\)

\[f(1)=\sum_{d=1}^n\mu(d)g(d)
\]

把\(g(i)\)展开

\[f(1)=\sum_{d=1}^n\mu(d)\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{m}{d}}[\frac{n}{i}][\frac{m}{j}]
\]

很明显可以数论分块

所以再预处理一下\(\mu(i)\)的前缀和就行了

单词询问的复杂度就是\(O(\sqrt n)\)

总体复杂度\(O(T\sqrt n)\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 50000
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,m;
bool zs[MAX+1000];
int pri[MAX+1000],tot,mu[MAX+1000],ys[MAX+1000],dd[MAX+1000];
int smu[MAX+1000],sd[MAX+1000];
void pre()
{
zs[1]=true;mu[1]=ys[1]=1;
for(int i=2;i<=MAX;++i)
{
if(!zs[i])pri[++tot]=i,mu[i]=-1,ys[i]=2,dd[i]=1;
for(int j=1;j<=tot&&i*pri[j]<=MAX;++j)
{
zs[i*pri[j]]=true;
if(i%pri[j]==0)
{
mu[i*pri[j]]=0;
ys[i*pri[j]]=ys[i]/(dd[i]+1)*(dd[i]+2);
dd[i*pri[j]]=dd[i]+1;
break;
}
else mu[i*pri[j]]=-mu[i],ys[i*pri[j]]=ys[i]*2,dd[i*pri[j]]=1;
}
}
for(int i=1;i<=MAX;++i)smu[i]=smu[i-1]+mu[i];
for(int i=1;i<=MAX;++i)sd[i]=sd[i-1]+ys[i];
}
int main()
{
pre();
int T=read();
while(T--)
{
n=read();m=read();
if(n>m)swap(n,m);
long long ans=0;
int i=1,j;
while(i<=n)
{
j=min(n/(n/i),m/(m/i));
ans+=1ll*(smu[j]-smu[i-1])*sd[n/i]*sd[m/i];
i=j+1;
}
printf("%lld\n",ans);
}
return 0;
}

【BZOJ3994】约数个数和(莫比乌斯反演)的更多相关文章

  1. [SDOI2015][bzoj3994] 约数个数和 [莫比乌斯反演]

    题面: 传送门 思路: 首先,我们需要证明一个结论:d(i*j)等于sigma(gcd(x,y)==1),其中x为i的约数,y为j的约数 对于nm的每一个质因子pi分别考虑,设n = pi^ai + ...

  2. P3327 [SDOI2015]约数个数和 莫比乌斯反演

    P3327 [SDOI2015]约数个数和 莫比乌斯反演 链接 luogu 思路 第一个式子我也不会,luogu有个证明,自己感悟吧. \[d(ij)=\sum\limits_{x|i}\sum\li ...

  3. 【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演

    [BZOJ3994][SDOI2015]约数个数和 Description  设d(x)为x的约数个数,给定N.M,求   Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组 ...

  4. BZOJ3994: [SDOI2015]约数个数和(莫比乌斯反演)

    Description  设d(x)为x的约数个数,给定N.M,求     Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Out ...

  5. [SDOI2015][bzoj 3994][Luogu P3327] 约数个数和 (莫比乌斯反演)

    题目描述 设d(x)d(x)d(x)为xxx的约数个数,给定NNN.MMM,求 ∑i=1N∑j=1Md(ij)\sum^{N}_{i=1}\sum^{M}_{j=1} d(ij)i=1∑N​j=1∑M ...

  6. [SDOI2015]约数个数和 莫比乌斯反演

    ---题面--- 题解: 为什么SDOI这么喜欢莫比乌斯反演,,, 首先有一个结论$$d(ij) = \sum_{x|i}\sum_{y|j}[gcd(x, y) == 1]$$为什么呢?首先,可以看 ...

  7. luogu P3327 [SDOI2015]约数个数和 莫比乌斯反演

    题面 我的做法基于以下两个公式: \[[n=1]=\sum_{d|n}\mu(d)\] \[\sigma_0(i*j)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]\] 其中\(\ ...

  8. BZOJ 3994: [SDOI2015]约数个数和 [莫比乌斯反演 转化]

    2015 题意:\(d(i)\)为i的约数个数,求\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m d(ij)\) \(ij\)都爆int了.... 一开始想容斥一下 ...

  9. BZOJ 3994: [SDOI2015]约数个数和3994: [SDOI2015]约数个数和 莫比乌斯反演

    https://www.lydsy.com/JudgeOnline/problem.php?id=3994 https://blog.csdn.net/qq_36808030/article/deta ...

  10. 洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)

    题目描述 设d(x)为x的约数个数,给定N.M,求 \sum^N_{i=1}\sum^M_{j=1}d(ij)∑i=1N​∑j=1M​d(ij) 输入输出格式 输入格式: 输入文件包含多组测试数据.第 ...

随机推荐

  1. vscode php跳转

    最近在写一个php项目,最后选定使用vscode编辑器,然后研究了一下断点调试.格式代码.点击跳转 以下是配置步骤,记录一下 1.代码格式化及跳转  1.前提条件:安装7.0以上版本php,     ...

  2. Python数据分析学习-re正则表达式模块

    正则表达式 为高级的文本模式匹配.抽取.与/或文本形式的搜索和替换功能提供了基础.简单地说,正则表达式(简称为 regex)是一些由字符和特殊符号组成的字符串,它们描述了模式的重复或者表述多个字符,于 ...

  3. PHPUnit简介及使用

    一.PHPUnit是什么? 1.它是一款轻量级的PHP测试框架,地址:http://www.phpunit.cn 2.手册:http://www.phpunit.cn/manual/5.7/zh_cn ...

  4. C语言_指针变量的赋值与运算,很详细

    指针变量的赋值 指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值.未经赋值的指针变量不能使用, 否则将造成系统混乱,甚至死机.指针变量的赋值只能赋予地址, 决不能赋予任何其它数据 ...

  5. MySQL主从复制_复制过滤

    关于主从过滤,建议只在从服务器做设定,在Master 端为保证二进制日志的完整, 不建议使用二进制日志过滤. Master 可用参数: binlog-do-db= #定义白名单,仅将制定数据库的相关操 ...

  6. HDU - 1846 Brave Game 巴什博弈

    思路:直接判断n是不是m+1的倍数,若是先手则输,否则赢. AC代码 #include <cstdio> #include <cmath> #include <algor ...

  7. 一个逼格很低的appium自动化测试框架

    Github地址: https://github.com/wuranxu 使用说明 1. 安装配置Mongo数据库 下载地址 mongo是用来存放元素定位的,截图如下: 通过case_id区分每个ca ...

  8. AES对称加密

    import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.Secre ...

  9. 笔记︱信用风险模型(申请评分、行为评分)与数据准备(违约期限、WOE转化)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 巴塞尔协议定义了金融风险类型:市场风险.作业风 ...

  10. HighCharts之2D带Label的折线图

    HighCharts之2D带Label的折线图 1.HighCharts之2D带Label的折线图源码 LineLabel.html: <!DOCTYPE html> <html&g ...