洛谷$P$3327 约数个数和 $[SDOI2015]$ 莫比乌斯反演
正解:莫比乌斯反演
解题报告:
先考虑证明一个结论,$d_{i\cdot j}=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]$
看起来就很对的样子,但还是证下趴$QwQ$
考虑分解质因数,设$i=p_{1}^{a_{1}}\cdot p_{2}^{a_{2}}\cdot p_{3}^{a_{3}},j=p_{1}^{b_{1}}\cdot p_{2}^{b_{2}}\cdot p_{3}^{b_{3}}$,则$i\cdot j=p_{1}^{a_{1}+b_{1}}\cdot p_{2}^{a_{2}+b_{2}}\cdot p_{3}^{a_{3}+b_{3}}$,则有$d_{i\cdot j}=\prod (a_{i}+b_{i}+1)$
于是记$p_{i}$的贡献为$(a_{i}+b_{i}+1)$,考虑结论右侧的一对取值,设$t1,t2$互质且都不含质因数$p_{i}$,则$(t_{1}\cdot p_{i}^{a_{i}},b_{i}),(t_{1}\cdot p_{i}^{a_{i}-1},b_{i}),...,(t_{1},b_{1}\cdot p_{i}^{b_{i}})$都会有1的贡献,总共就是$a_{i}+b_{i}+1$的贡献,得证!
欧克证完结论就要考虑公式变形了鸭$QwQ$
$\sum_{i=1}^{n}\sum_{j=1}^{m}d_{i\cdot j}=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]$
考虑每一个数对$t_{1},t_{2}$会被枚举多少次?显然$t_{1}$会被枚举$\frac{n}{t_{1}}$次,$t_{2}$会被枚举$\frac{m}{t_{2}}$次
于是继续变形得,原式=$\sum_{t_{1}=1}^{n}\sum_{t_{2}=1}^{m}\frac{n}{t_{1}}\cdot \frac{m}{t_{2}}\cdot [gcd(t_{1},t_{2})==1]$
这时候考虑到莫比乌斯函数的性质,$\left\{\begin{matrix}\sum_{d|n}\mu(d)=0,n>1\\ \sum_{d|n}\mu(d)=1,n=1\end{matrix}\right.$,于是原式可以化为,$\sum_{t_{1}=1}^{n}\sum_{t_{2}=1}^{m}\frac{n}{t_{1}}\cdot \frac{m}{t_{2}}\cdot \sum_{d|gcd(t_{1},t_{2})}\mu(d)=\sum_{t_{1}=1}^{n}\sum_{t_{2}=1}^{m}\frac{n}{t_{1}}\cdot \frac{m}{t_{2}}\cdot \sum_{d|t_{1}\text{&}d|t_{2}}\mu(d)$
然后按照一般的套路来说这里就差不多要考虑变换下$\sum$的顺序了
这儿就考虑把$\sum mu(d)$提到最前面,不难想到式子就变成了,$\sum \mu(d)\cdot \sum_{t_{1}=1}^{\frac{n}{d}}\sum_{t_{2}=1}^{\frac{m}{d}}\frac{n}{t_{1}\cdot d}\cdot \frac{m}{t_{2}\cdot d}$
嗷这样儿还不够,最后还要再,变下形$QwQ$,$\sum_{d=1}^{min(m,n)} \mu(d)\cdot \sum_{t_{1}=1}^{\frac{n}{d}}\frac{n}{t_{1}\cdot d}\cdot \sum_{t_{2}=1}^{\frac{m}{d}}\frac{m}{t_{2}\cdot d}$,发现对于$\sum_{t_{1}=1}^{\frac{n}{d}}\frac{n}{t_{1}\cdot d}$这样儿一个式子,其实$\frac{n}{d}$是固定的,设$x=\frac{n}{d}$,于是原式变为$\sum_{t_{1}=1}^{d}\frac{d}{i}$
考虑预处理一个$g(d)=\sum_{t_{1}=1}^{d}\frac{d}{i}$,于是答案式变为$\sum_{d=1}^{min(m,n)} \mu(d)\cdot g(\frac{n}{d})\cdot g(\frac{m}{d})$
然后到这儿依然没有结束昂嘤嘤嘤,,,
考虑$g(d)$怎么预处理鸭$QAQ$
显然直接暴力地$O(n^{2})$处理是不可取的$QwQ$
于是考虑这个所谓$g(d)$的意义是啥昂$QwQ$
观察$g(d)$的表达式,不难发现$g(x)$可以理解为$\sum_{i=1}^{x}$$x$范围内为$i$的倍数的数的数量之和,也就是题目中的$d(x)$的前缀和,于是现在就变成了线性求$d(x)$
我的方法是直接枚举质因数,然后用类似埃氏筛的方法,对质因数的倍数直接乘指数+1即可$QwQ$
然后还有就是,莫比乌斯反演的话,数论分块是基本素养了趴,,,?太套路了不说了$QwQ$
$over$
啊记得开$ll$鸭
真·$over$
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define il inline
#define int long long
#define fi first
#define sc second
#define gc getchar()
#define mp make_pair
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=5e4+;
int g[N],sum[N],pr[N],pr_cnt,miu[N];
bool is_prim[N]; il int read()
{
ri x=;rb y=;rc ch=gc;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void pre_g()
{
rp(i,,N-)g[i]=;sum[]=;
rp(i,,N-)
{
if(!is_prim[i])g[i]=g[i]<<;sum[i]=sum[i-]+g[i];
if(!is_prim[i]){rp(j,,(N-)/i){ri tmp=,tmp_j=j;while(j%i==)++tmp,j/=i;j=tmp_j;g[i*j]*=(tmp+);}}
}
}
il void pre_mu()
{
miu[]=;
rp(i,,N-)
{
if(!is_prim[i])miu[i]=-,pr[++pr_cnt]=i;
rp(j,,pr_cnt){if(pr[j]*i>N-)break;is_prim[pr[j]*i]=;if(!(i%pr[j])){miu[i*pr[j]]=;break;}else miu[i*pr[j]]=-miu[i];}
}
rp(i,,N-)miu[i]+=miu[i-];
} main()
{
freopen("3327.in","r",stdin);freopen("3327.out","w",stdout);
pre_mu();pre_g();ri T=read();
while(T--)
{ri n=read(),m=read(),ret=,j;if(n>m)swap(n,m);for(ri i=;i<=n;i=j+){j=min(n/(n/i),m/(m/i));ret+=(miu[j]-miu[i-])*sum[n/i]*sum[m/i];}printf("%lld\n",ret);}
return ;
}
洛谷$P$3327 约数个数和 $[SDOI2015]$ 莫比乌斯反演的更多相关文章
- 洛谷P3327 [SDOI2015]约数个数和 【莫比乌斯反演】
题目 设d(x)为x的约数个数,给定N.M,求\(\sum_{i = 1}^{N} \sum_{j = 1}^{M} d(ij)\) 输入格式 输入文件包含多组测试数据.第一行,一个整数T,表示测试数 ...
- 洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)
传送门 公式太长了……我就直接抄一下这位大佬好了……实在懒得打了 首先据说$d(ij)$有个性质$$d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]$$ 我们所求的答案为$ ...
- 【BZOJ3994】约数个数和(莫比乌斯反演)
[BZOJ3994]约数个数和(莫比乌斯反演) 题面 求\[\sum_{i=1}^n\sum_{j=1}^md(ij)\] 多组数据\((<=50000组)\) \(n,m<=50000\ ...
- BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演
BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表 ...
- LOJ #2185 / 洛谷 P3329 - [SDOI2015]约数个数和(莫比乌斯函数)
LOJ 题面传送门 / 洛谷题面传送门 题意: 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^md(ij)\),\(d(x)\) 为 \(x\) 的约数个数. \( ...
- P3327/bzoj3994 [SDOI2015]约数个数和(莫比乌斯反演)
P3327 [SDOI2015]约数个数和 神犇题解(转) 无话可补 #include<iostream> #include<cstdio> #include<cstri ...
- BZOJ3994:约数个数和(莫比乌斯反演:求[1,N]*[1,M]的矩阵的因子个数)
Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Outpu ...
- 【BZOJ 3994】3994: [SDOI2015]约数个数和(莫比乌斯反演)
3994: [SDOI2015]约数个数和 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接 ...
- 「BZOJ 3994」「SDOI 2015」约数个数和「莫比乌斯反演」
题意 设\(d(x)\)为\(x\)的约数个数,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij)\). 题解 首先证个公式: \[d(ij) = \sum_{x|i}\sum_ ...
随机推荐
- Laravel 下的伪造跨站请求保护 CSRF#
简介# Laravel 可以轻松地保护应用程序免受跨站请求伪造(CSRF) 的攻击.跨站请求伪造是一种恶意的攻击, 他凭借已通过身份验证的用户身份来运行未经过授权的命令. Laravel 会自动为每个 ...
- docker + jenkins 自动化部署
公司书架上有本docker的书籍,正好最近事不多就写个demo来玩一玩. DevOps未死,ContainerOps已到 ContainerOps VS DevOps 避免了复杂的环境,应用之间的相互 ...
- HDU-6668-Game 百度之星第一场B
在多个连续的区间段中,选出连续重复度最高的区间,这样连续选出多个重复度最高的不相交区间,然后从第一个区间的左边已经右边开始,连续贪心即可,答案取最小值 #include<iostream> ...
- gradle在build的时候找不到某个jar包的解决办法
前几天公司来新人, 我给他装项目环境的时候遇到一个问题, 在执行gradle build时遇到一系列的错误, 我一个个分析并解决了, 特此记录, 以供他人参考. 一, 首先遇到了找不到spring-b ...
- linux常用命令速记
一.命令提示符说明 1. [root@localhost ~]# root: 当前登录用户 localhost: 主机名 ~: 当前所在目录 #: 超级用户提示符($: 普通用户) 2. -rwxr- ...
- Python--day38--JoinableQueue解决生产者消费者模型
############################# # 在消费者这一端: #每次获取一个数据 #处理一个数据 #发送一个记号:标志一个数据被处理成功 #在生产者这一端: #每一次生成一个数据 ...
- 三星s5830刷机小记
拿起好久没用的三星s5830手机,看了看手机内存所无几,运行十分缓慢,就想着收拾下,当个备机用,在刷机前我做了个小实验,先把手机root,安装RE管理器,把system/app下的所有东西都删了,因为 ...
- win10 uwp 使用 AppCenter 自动构建
微软在今年7月上线 appcenter.ms 这个网站,通过 App Center 可以自动对数千种设备进行适配测试.快速将应用发送给测试者或者直接发布到应用商店.做到开发的构建和快速测试,产品的遥测 ...
- 【mac】关于mac的一些命令
一. 如何查看自己的文件大小,所有文件占了多少? du -h -d 1 . 当前目录文件以及大小 sudo du -h -d 1 / 所目录下的文件以及大小
- 2019-9-2-C#同步方法转异步
title author date CreateTime categories C#同步方法转异步 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 17:23: ...