洛谷$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重定向到上一个页面怎么带参数返回 withsucess 成功提示信息
//控制器中 return back()->with('success','操作成功'); //with的参数1是一个session变量名,参数2为该session变量值,在视图直接这样获取 @ ...
- 「BZOJ2510」弱题
「BZOJ2510」弱题 这题的dp式子应该挺好写的,我是不会告诉你我开始写错了的,设f[i][j]为操作前i次,取到j小球的期望个数(第一维这么大显然不可做),那么 f[i][j]=f[i-1][j ...
- python基础之逻辑题(1)
python基础之逻辑题(1) 1.用一行代码实现数值交换? 2.求结果--fromkeys? 3.1,2,3,4,5能组成多少个互不相同且无重复的三位数? 4.有两个字符串列表a和b,每个字符串是逗 ...
- Python基础:28正则表达式
一:概述 正则表达式(RE)为高级文本模式匹配,以及搜索-替代等功能提供了基础.正则表达式(RE)是一些由字符和特殊符号组成的字符串,它们能匹配多个字符串.Python通过标准库的re模块支持正则表达 ...
- Android中使用lambda表达式
lambda 语法简介 视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 如果刚学Android,不知道怎么写点击事件可以跳转,传送门 要想在Android中使用lambda语法 ...
- 请求(RequestInfo)
请求类型 StringRequestInfo 用在 SuperSocket 命令行协议中. 你也可以根据你的应用程序的需要来定义你自己的请求类型. 例如, 如果所有请求都包含 DeviceID 信息, ...
- Laravel5.5 支付宝手机网站支付的教程
https://segmentfault.com/a/1190000015559571 这篇文章主要介绍了Laravel5.5 支付宝手机网站支付的教程,小编觉得挺不错的,现在分享给大家,也给大家做个 ...
- 2018-6-24-WPF-使用RPC调用其他进程
title author date CreateTime categories WPF 使用RPC调用其他进程 lindexi 2018-06-24 14:41:29 +0800 2018-2-13 ...
- 配置DNS代理
- javascript异步编程 Async/await
Async/await Async/await 在学习他之前应当补充一定的 promise 知识 它是一种与 promise 相配合的特殊语法,目前被认为是异步编程的终级解决方案 值得我们每一个人学习 ...