2015

题意:\(d(i)\)为i的约数个数,求\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m d(ij)\)


\(ij\)都爆int了....

一开始想容斥一下用\(d(i)\)和\(d(j)\)算\(d(ij)\),发现不行...

然后翻题解看到了一步好神的转化:

\[d(nm) = \sum_{i\mid n} \sum_{j\mid m} [gcd(i,j)=1]
\]

晚上再补吧还是没拿草稿纸...




补:

\(Proof.\)

  • 首先注意约数个数 相同的算一个

    约数个数公式\(\prod (a_i+1)\)

    考虑一个质因子,\(p^x,p^y \rightarrow p^x p^y\)

    \(x+y+1\)对应了\(gcd(p^x, 1)...gcd(1, 1)...gcd(1,p^y)\)

    质因子相互独立,乘起来


然后愉♂悦的套路推♂倒

\[\begin{align*}
\sum_{i=1}^n \sum_{j=1}^m d(ij) &= \sum_{i=1}^n \sum_{j=1}^m \sum_{x\mid i} \sum_{y\mid j} [gcd(x,y)=1]\\
先枚举约数,交换i,j\ x,y\\
&=\sum_{i=1}^n \sum_{j=1}^m \sum_{d\mid i,d\mid j}\mu(d) \frac{n}{i} \frac{m}{i}\\
&=\sum_{d=1}^n \mu(d)\sum_{i=1}^\frac{n}{i} \sum_{j=1}^\frac{m}{i} \frac{n}{id}\frac{m}{jd}\\
&=\sum_{d=1}^n \mu(d) f(\frac{n}{id})f(\frac{m}{jd})\\
\end{align*}
\]

问题就是\(f(n)=\sum_{i=1}^n\frac{n}{i}\)怎么求了

可以n根n预处理...

更巧妙的做法是,发现\(f\)就是\(d\)的前缀和,因为\(\frac{n}{i}\)表示的就是\(1..n\)有几个i的倍数


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=5e4+5;
typedef long long ll;
#define pii pair<int, int>
#define MP make_pair
#define fir first
#define sec second
inline int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
} int n, m;
int notp[N], p[N], mu[N]; ll f[N]; pii lp[N];
void sieve(int n) {
mu[1] = 1; f[1] = 1;
for(int i=2; i<=n; i++) {
if(!notp[i]) p[++p[0]] = i, mu[i] = -1, f[i] = 2, lp[i] = MP(i, 1);
for(int j=1; j<=p[0] && i*p[j]<=n; j++) {
int t = i*p[j];
notp[t] = 1;
if(i%p[j] == 0) {
mu[t] = 0;
lp[t] = MP(p[j], lp[i].sec + 1);
f[t] = f[i] / (lp[i].sec + 1) * (lp[t].sec + 1);
break;
}
mu[t] = -mu[i];
lp[t] = MP(p[j], 1);
f[t] = f[i] * (lp[t].sec + 1);
}
}
for(int i=1; i<=n; i++) mu[i] += mu[i-1], f[i] += f[i-1];
}
ll cal(int n, int m) {
ll ans=0; int r;
for(int i=1; i<=n; i=r+1) {
r = min(n/(n/i), m/(m/i));
ans += (mu[r] - mu[i-1]) * f[n/i] * f[m/i];
}
return ans;
}
int main() {
//freopen("in","r",stdin);
sieve(N-1);
int T=read();
while(T--){
n=read(); m=read();
if(n>m) swap(n, m);
printf("%lld\n",cal(n, m));
}
}

BZOJ 3994: [SDOI2015]约数个数和 [莫比乌斯反演 转化]的更多相关文章

  1. BZOJ.3994.[SDOI2015]约数个数和(莫比乌斯反演)

    题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^md(ij)\] \(Solution\) 有结论:\[d(nm)=\sum_{i|d}\sum_{j|d ...

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

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

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

    https://www.lydsy.com/JudgeOnline/problem.php?id=3994 https://blog.csdn.net/qq_36808030/article/deta ...

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

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

  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. ●BZOJ 3994 [SDOI2015]约数个数和

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3994 题解: 莫比乌斯反演 (先定义这样一个符号[x],如果x为true,则[x]=1,否则 ...

  8. 【刷题】BZOJ 3994 [SDOI2015]约数个数和

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

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

    ---题面--- 题解: 为什么SDOI这么喜欢莫比乌斯反演,,, 首先有一个结论$$d(ij) = \sum_{x|i}\sum_{y|j}[gcd(x, y) == 1]$$为什么呢?首先,可以看 ...

随机推荐

  1. Spark环境搭建(中)——Hadoop安装

    1. 下载Hadoop 1.1 官网下载Hadoop http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.9.0/hadoop-2. ...

  2. TypeScript笔记 5--变量声明(解构和展开)

    解构是什么 解构(destructuring assignment)是一种表达式,将数组或者对象中的数据赋给另一变量. 在开发过程中,我们经常遇到这样问题,需要将对象某个属性的值赋给其它两个变量.代码 ...

  3. 函数iconv_substr和mb_substr

    二个函数iconv_substr和mb_substr,均可以在当前字符下进行字符串截取,以达到中文字符截取的不乱码. 应该如何选择呢? 1.iconv库在某些操作系统上可能运行不正确,需要安装GNU扩 ...

  4. [field:softlinks/]逻辑过程

    在plus/download.php 在dededln\include\taglib\channel\softlinks.lib.php

  5. 【开发技术】如何查看项目中struts的版本

    struts-configer.xml(struts1)或struts.xml(struts2)中 struts-2.0.dtd处表示版本号

  6. UML图学习之二 类图

    类图(ClassDiagrams)是根据系统中的类以及各类之间的关系描述系统的静态视图.类图不仅显示系统内信息的结构,还描述系统内这些信息的行为.类图的一个重要目的是为其他图(如顺序图.交互图)定义一 ...

  7. Linux下环境变量设置的三种方法

    如想将一个路径加入到$PATH中,可以像下面这样做: 1.控制台中设置,不赞成这种方式,因为他只对当前的shell 起作用,换一个shell设置就无效了:$PATH="$PATH" ...

  8. js双向绑定和地址传递带来的痛苦解决方案之对象拷贝

    function cloneObj(obj) { var newObj = {}; if (obj instanceof Array) { newObj = []; } for (var key in ...

  9. Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。

    时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...

  10. python_如何修改装饰器中参数?

    案例: 为分析程序内哪些函数执行时间开销较大,我们需定义一个带timeout参数的装饰器 需求: 统计被装饰函数的运行时间 时间大于timeout时,将此次函数调用记录到log日志中 运行时可以修改t ...