慢慢化柿子吧

要求的是这个

\[\sum_{i=1}^N\sum_{j=1}^Md(ij)
\]

神奇的约数个数函数有一个这样的性质

\[d(ij)=\sum_{x|i}\sum_{y|j}[(x,y)=1]
\]

试着从唯一分解定理的角度去理解,将\(i,j\)分别分解质因数

显然\(d(ij)\)应该等于每一个\(p\)在\(i,j\)中分解出来的指数加起来加1再相乘

所以分别枚举所有约数的话,保证这对约数互质就可以求出所有约数了

之后现在的答案变成了

\[\sum_{i=1}^N\sum_{j=1}^M\sum_{x|i}\sum_{y|j}[(x,y)=1]
\]

一看就很烦人啊,把\(x,y\)放到前面来枚举

\[\sum_{x=1}^N\sum_{y=1}^M[(x,y)=1]\sum_{x|i}\sum_{y|j}1
\]

显然后面那个东西就是

\[\left \lfloor \frac{N}{x} \right \rfloor\times \left \lfloor \frac{M}{y} \right \rfloor
\]

于是答案变成了

\[\sum_{x=1}^N\sum_{y=1}^M[(x,y)=1]\left \lfloor \frac{N}{x} \right \rfloor\times \left \lfloor \frac{M}{y} \right \rfloor
\]

开始套路了

\[f(n)=\sum_{i=1}^N\sum_{j=1}^M[(i,j)=n]\left \lfloor \frac{N}{i} \right \rfloor\times \left \lfloor \frac{M}{j} \right \rfloor
\]

\[F(n)=\sum_{i=1}^N\sum_{j=1}^M[n|(i,j)]\left \lfloor \frac{N}{i} \right \rfloor\times \left \lfloor \frac{M}{j} \right \rfloor
\]

\[=\sum_{i=1}^{ \left \lfloor \frac{N}{i} \right \rfloor}\sum_{j=1}^{ \left \lfloor \frac{M}{j} \right \rfloor} \left \lfloor \frac{N}{in} \right \rfloor \left \lfloor \frac{M}{jn} \right \rfloor
\]

显然就有

\[F(n)=\sum_{n|d}f(d)
\]

\[f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d)
\]

因为我们要求的只有\(f(1)\)

所以

\[Ans=\sum_{d=1}^N\mu(d)\sum_{i=1}^{\left \lfloor \frac{N}{i} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{M}{j} \right \rfloor}\left \lfloor \frac{N}{id} \right \rfloor \left \lfloor \frac{M}{jd} \right \rfloor
\]

我们发现如果\(\frac{N}{d}\)和\(\frac{M}{d}\)固定了,后面这个柿子就非常好求了

就是\(\frac{N}{d}\)和\(\frac{M}{d}\)的约数个数前缀和

于是我们可以线筛约数个数函数和\(\mu\)之后就可以了

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define re register
#define maxn 50005
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int p[maxn>>1],f[maxn],pre[maxn],mu[maxn],d[maxn],t[maxn];
int T,n,m;
int main()
{
f[1]=1,mu[1]=1,d[1]=1;
for(re int i=2;i<=50000;i++)
{
if(!f[i]) p[++p[0]]=i,mu[i]=-1,d[i]=2,t[i]=1;
for(re int j=1;j<=p[0]&&p[j]*i<=50000;j++)
{
f[p[j]*i]=1;
if(i%p[j]==0)
{
d[p[j]*i]=d[i]/(t[i]+1)*(t[i]+2);
t[p[j]*i]=t[i]+1;
break;
}
d[p[j]*i]=d[p[j]]*d[i];
mu[p[j]*i]=-1*mu[i];
t[p[j]*i]=1;
}
}
for(re int i=1;i<=50000;i++) pre[i]=pre[i-1]+mu[i],d[i]+=d[i-1];
T=read();
while(T--)
{
n=read(),m=read();
if(n>m) std::swap(n,m);
LL ans=0;
for(re int l=1,r;l<=n;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans+=(LL)d[n/l]*d[m/l]*(pre[r]-pre[l-1]);
}
printf("%lld\n",ans);
}
return 0;
}

【[SDOI2015]约数个数和】的更多相关文章

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

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

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

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

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

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

  4. 洛谷 [SDOI2015]约数个数和 解题报告

    [SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...

  5. BZOJ 3994: [SDOI2015]约数个数和

    3994: [SDOI2015]约数个数和 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 898  Solved: 619[Submit][Statu ...

  6. 【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演

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

  7. 洛谷P3327 - [SDOI2015]约数个数和

    Portal Description 共\(T(T\leq5\times10^4)\)组数据.给出\(n,m(n,m\leq5\times10^4)\),求\[\sum_{i=1}^n\sum_{j= ...

  8. P3327 [SDOI2015]约数个数和 莫比乌斯反演

    P3327 [SDOI2015]约数个数和 莫比乌斯反演 链接 luogu 思路 第一个式子我也不会,luogu有个证明,自己感悟吧. \[d(ij)=\sum\limits_{x|i}\sum\li ...

  9. [BZOI 3994] [SDOI2015]约数个数和(莫比乌斯反演+数论分块)

    [BZOI 3994] [SDOI2015]约数个数和 题面 设d(x)为x的约数个数,给定N.M,求\(\sum _{i=1}^n \sum_{i=1}^m d(i \times j)\) T组询问 ...

  10. 【BZOJ】3994: [SDOI2015]约数个数和

    题意: \(T(1 \le T \le 50000)\)次询问,每次给出\(n, m(1 \le n, m \le 50000)\),求\(\sum_{i=1}^{n} \sum_{j=1}^{m} ...

随机推荐

  1. 在使用HttpClient做客户端调用一个API时 模拟并发调用时发生“死锁"?

    平时还是比较喜欢看书的..但有时候遇到问题还是经常感到脑袋一蒙..智商果然是硬伤.. 同事发现了个问题,代码如下: class Program { static void Main(string[] ...

  2. [转] 如何让代码可测试化(C#)

    让代码可测试化 本篇介绍如何把我们目前最常见的代码转换为可以单元测试的代码,针对业务逻辑层来实现可测试性,我们以银行转账为例,通常代码如下: public class TransferControll ...

  3. TRUNCATE TABLE 与 DELETE的区别

    delete from aatruncate table aa 区别1.delete from后面可以写条件,truncate不可以2.delete from记录是一条条删的,所删除的每行记录都会进日 ...

  4. nohup磁盘打满问题排查与解决

    使用nohup ... & 命令启动服务器后,磁盘满了,服务宕了,然后一步一步排查是哪个文件过大,最终定位到是nohup.out文件过大,占了40G, df -lh #磁盘容量命令 du -s ...

  5. 小程序插入html代码

    转自:https://blog.csdn.net/BetterGG/article/details/81027291 一.首先,html 分 2 种情况: 1.我在做详情页开发的时候发现获取到的数据是 ...

  6. WPF中ScrollViewer嵌套引发滚动失灵的Bug

    事情起因 测试报告说存在滚动条不能拖动的情况,我们几个开发人员多次测试都未重现该问题.后面发现是操作系统的问题,在XP和部分Win7上会存在该问题.而在我们开发人员的机器上,包括Win7 SP1,Wi ...

  7. digester解析xml文件

    在我们的项目中或多或少会采用xml来做配置文件,你可以采用Java原生支持的sax.DOM或者第三方的dom4j等.虽然提供了各式各样的解析方式,但是解析一个复杂的xml所编写的Java代码是非常麻烦 ...

  8. java自学之路-开篇

    开篇 想写一些java自学文章的心思起好久了,也在心里规划了一段时间,今天终于开始正式付于纸上.接下来要写的内容从java基础开始,一步步到正式工作用到的技术,整个体系适合java初学者自学.内容可能 ...

  9. 阿里云CentOS7.3配置Java Web应用和Tomcat步骤

    阿里云的Linux系统包括CentOS7.3配置了密钥对 怎样将自己ECS实例绑定密钥对,并启用秘钥: https://help.aliyun.com/document_detail/51798.ht ...

  10. JAVASE(说出ArrayList,LinkedList的储存性能和特性)

    说出ArrayList,和LinkedList的储存性能和特性? 答: ##  ArrayList采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,优点是索引读取快,从最后插入和删除元素速 ...