【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. php+redis 学习 二 悲观锁

    <?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 实现悲观锁机制 * */ $timeout = 5 ...

  2. 试着把.net的GC讲清楚(1)

    什么是GC? GC(garbage collection)是对内存管理中回收已经不用的内存的一种机制,我们熟知的java和.net都有自己的GC机制,是内存管理的一部分. 为什么会有GC呢?是因为动态 ...

  3. CentOS 6下编译安装MySQL 5.6

    一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm -e ...

  4. Three.js 学习笔记(1)--坐标体系和旋转

    前言 JavaScript 3D library The aim of the project is to create an easy to use, lightweight, 3D library ...

  5. 获取目录-Winform

    // 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.G ...

  6. 使用maven搭建hibernate的pom文件配置

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  7. Samba服务器的安装与配置

    Samba服务器主要的功能是实现本地windows系统下方便读写局域网内虚拟机下的文件: Samba与window连接需要使用NetBIOS协议,请确认你的Windows系统已经安装了NetBIOS协 ...

  8. windows转mac-开发环境搭建(一):需要搭建的环境及安装的工具

    作为一个java后端开发者来说,随着项目的增加,前段时间用windows真是受尽折磨,电脑卡到不行,在我们开发部技术大佬的一再安利之下,狠下心选了个17年13寸带touch bar的MacBook P ...

  9. Android动态加载技术(插件化技术)

    No1: 插件化技术的好处: 1)减轻应用的内存和CPU占用 2)实现热插拔,即在不发布新版本的情况下更新某些模块 No2: 插件化方案必须要解决三个基础性问题:资源访问.Activity生命周期的管 ...

  10. http协议——cookie详解

    http是无状态的,所以引入了cookie来管理服务器与客户端之间的状态 与cookie相关的http首部字段有: 1.Set-Cookie:它一个响应首部字段,从服务器发送到客户端,当服务器想开始通 ...