【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. 【Tools】ubuntu虚拟机Vmware Tools 安装记录

    1.下载VmwareTools 链接: https://pan.baidu.com/s/1c4baji4 密码: h3si 2.终端打开下载文件位置 cd /home/ubuntu/Downloads ...

  2. 关于Frame加背景的那点事?

    最近新生问我一个问题,继承自Frame(可不是继承自JFrame)的框架怎样添加背景图片, 真够坑的,当时还真懵了,废话少说直接上代码: import java.awt.*; import java. ...

  3. 洛谷P2891 Dining P1402 酒店之王【类二分图匹配】题解+代码

    洛谷P2891 Dining P1402 酒店之王[类二分图匹配]题解+代码 酒店之王 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的 ...

  4. Winform下去除MDI窗体边框

    做项目中间遇到了MDI窗体内边框的问题,经过苦苦寻找,最终得到了解决方案 在Main窗体中调用API // Win32 Constants ; ; private const int WS_BORDE ...

  5. cmd命令报4048错误

    解决方法: win10系统:快捷键win+x,找到命令提示符(管理员),打开再下载相应的依赖包. win7/8:打开开始,输入命令提示符,找到管理员权限的命令提示符,打开再下载相应的依赖包. 提示:如 ...

  6. cf B. Mishka and trip (数学)

    题意   Mishka想要去一个国家旅行,这个国家共有个城市,城市通过道路形成一个环,即第i个城市和第个城市之间有一条道路,此外城市和之间有一条道路.这个城市中有个首中心城市,中心城市与每个城市(除了 ...

  7. nyoj886 取石子(八) 威佐夫博弈

    好累,坐了一天火车, 终于到学校了. 思路:仔细观察威佐夫博弈,发现P态的所有数字都是不重复的,例如(0,0).(1,2).(3,5).(4,7).(6, 10).(8,13).(9,15).(11, ...

  8. JAVA在不确定具体 Annotation 类型时,获得注解参数

       package com.lzw.demo; @SpringBootApplication public class DemoApplication { public static void ma ...

  9. Spring data mongodb 聚合,投射,内嵌数组文档分页.

    尽量别直接用 DBObject  ,Spring data mongodb 的api 本来就没什么多大用处,如果还直接用 DBObject 那么还需要自己去解析结果,说动做个对象映射,累不累 Spri ...

  10. JAVA 处理 Spring data mongodb 时区问题

    Spring data mongodb 查询出结果的时候会自动 + 8小时,所以我们看起来结果是对的 但是我们查询的时候,并不会自动 + 8小时,需要自己处理 解决方法 1   @JsonFormat ...