正解:莫比乌斯反演

解题报告:

传送门!

先考虑证明一个结论,$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]$ 莫比乌斯反演的更多相关文章

  1. 洛谷P3327 [SDOI2015]约数个数和 【莫比乌斯反演】

    题目 设d(x)为x的约数个数,给定N.M,求\(\sum_{i = 1}^{N} \sum_{j = 1}^{M} d(ij)\) 输入格式 输入文件包含多组测试数据.第一行,一个整数T,表示测试数 ...

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

    传送门 公式太长了……我就直接抄一下这位大佬好了……实在懒得打了 首先据说$d(ij)$有个性质$$d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]$$ 我们所求的答案为$ ...

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

    [BZOJ3994]约数个数和(莫比乌斯反演) 题面 求\[\sum_{i=1}^n\sum_{j=1}^md(ij)\] 多组数据\((<=50000组)\) \(n,m<=50000\ ...

  4. BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演

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

  5. LOJ #2185 / 洛谷 P3329 - [SDOI2015]约数个数和(莫比乌斯函数)

    LOJ 题面传送门 / 洛谷题面传送门 题意: 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^md(ij)\),\(d(x)\) 为 \(x\) 的约数个数. \( ...

  6. P3327/bzoj3994 [SDOI2015]约数个数和(莫比乌斯反演)

    P3327 [SDOI2015]约数个数和 神犇题解(转) 无话可补 #include<iostream> #include<cstdio> #include<cstri ...

  7. BZOJ3994:约数个数和(莫比乌斯反演:求[1,N]*[1,M]的矩阵的因子个数)

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

  8. 【BZOJ 3994】3994: [SDOI2015]约数个数和(莫比乌斯反演)

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

  9. 「BZOJ 3994」「SDOI 2015」约数个数和「莫比乌斯反演」

    题意 设\(d(x)\)为\(x\)的约数个数,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij)\). 题解 首先证个公式: \[d(ij) = \sum_{x|i}\sum_ ...

随机推荐

  1. css浮动规则

    1.浮动元素会从文档正常流中删除,但它仍会影响布局 2.浮动非替换元素必须为其指定width,否则元素的width会趋于0而导致浮动元素不能完整显示3.一旦元素具有了浮动属性,它便成为了一个块级元素. ...

  2. python小数据池 is和 == 再谈编码

    1. 小数据池, id() 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. id() 查看变量的内存地址 2. is和==的区别 is 比较的是内存地址 == ...

  3. html实体字符转换成字符串

    function EntityToString(value) { let tag = document.createElement("div"); tag.innerHTML = ...

  4. 学习meta标签http-equiv属性

    meta标签http-equiv属性的使用:meta标签http-equiv属性的使用

  5. vue简单总结

    首先  介绍几个常见指令 指令:以属性的形式出现在标签上 v-xxx 1.内置指令 数据绑定指令  v-html v-text    举例 <span v-html="msg" ...

  6. 3、.net core 部署到IIS

    1)下载对应的Hosting Bundle https://dotnet.microsoft.com/download/dotnet-core/2.2 2)VS发布项目,选择window平台环境 3 ...

  7. poj 1436 && zoj 1391 Horizontally Visible Segments (Segment Tree)

    ZOJ :: Problems :: Show Problem 1436 -- Horizontally Visible Segments 用线段树记录表面能被看见的线段的编号,然后覆盖的时候同时把能 ...

  8. 2019-5-27-C#-很少人知道的科技

    title author date CreateTime categories C# 很少人知道的科技 lindexi 2019-05-27 19:33:36 +0800 2018-03-16 08: ...

  9. 【Learning Notes】线性链条件随机场(CRF)原理及实现

    1. 概述条件随机场(Conditional Random Field, CRF)是概率图模型(Probabilistic Graphical Model)与区分性分类( Discriminative ...

  10. java throw和catch同时使用

    当异常出现在当前方法中,程序只对异常进行部分处理,还有一些处理需要在方法的调用者中才能处理完成,此时还应该再次抛出异常,这样就可以让方法的调用者也能捕获到异常;   Eg: public static ...