【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} d(ij)\),其中\(d(n)\)表示\(n\)的约数个数
分析
有个结论:
$$\sum_{x_1}^{y_1} \sum_{x_2}^{y_2} \cdots \sum_{x_k}^{y_k} d(x_1 x_2 \cdots x_k) = \sum_{x_1}^{y_1} \sum_{x_2}^{y_2} \cdots \sum_{x_k}^{y_k} \prod_{i=1}^{k} \left \lfloor \frac{y_i}{x_i} \right \rfloor \prod_{i
(证明是二大重数学归纳,数学恐惧症的快快离开。
首先对于\(k=1\),我们可以通过算贡献证明。现在我们对\(k>1\)进行归纳:
我们需要证明:$$d_1(y_1, y_2, \cdots, y_k) = \sum_{x_1}^{y_1} \sum_{x_2}^{y_2} \cdots \sum_{x_k}^{y_k} d(x_1 x_2 \cdots x_k) = f_1 (y_1, y_2, \cdots, y_k) = \sum_{x_1}^{y_1} \sum_{x_2}^{y_2} \cdots \sum_{x_k}^{y_k} \prod_{i=1}^{k} \left \lfloor \frac{y_i}{x_i} \right \rfloor \prod_{i < j} [(x_i, x_j)=1]$$
我们通过\(y_1\)来归纳:
首先\(y_1=1\)时,发现就是\(k-1\)维的证明,根据归纳条件,成立。
然后对于\(y_1 > 1\),我们设$$d_2(y_1, y_2, \cdots, y_k) = d_1(y_1, y_2, \cdots, y_k) - d_1(y_1-1, y_2, \cdots, y_k)$$ $$f_2(y_1, y_2, \cdots, y_k) = f_1(y_1, y_2, \cdots, y_k) - f_1(y_1-1, y_2, \cdots, y_k)$$然后用\(y_2\)归纳\(d_2 = f_2\)。一直这样做下去,直到需要归纳\(d_{k+1} = f_{k+1}\):
就是需要证明这个结论:
\]
这个结论通过讨论质因子的贡献就能证明出。
题解
于是剩下的不多说,分块大法。
$$
\begin{align}
ans
& =
\sum_{i=1}^{n}
\sum_{j=1}^{m} d(ij)
\\
& =
\sum_{i=1}^{n}
\sum_{j=1}^{m} \left \lfloor \frac{n}{i} \right \rfloor \left \lfloor \frac{m}{j} \right \rfloor [(i, j)=1]
\
& =
\sum_{d=1}^{n} \mu(d)
\sum_{i=1}^{ \left \lfloor \frac{n}{d} \right \rfloor }
\sum_{j=1}^{ \left \lfloor \frac{m}{d} \right \rfloor } \left \lfloor \frac{n}{id} \right \rfloor \left \lfloor \frac{m}{jd} \right \rfloor
\
& =
\sum_{d=1}^{n} \mu(d)
\sum_{i=1}^{ \left \lfloor \frac{n}{d} \right \rfloor } \left \lfloor \frac{ \left \lfloor \frac{n}{d} \right \rfloor }{i} \right \rfloor
\sum_{j=1}^{ \left \lfloor \frac{m}{d} \right \rfloor } \left \lfloor \frac{ \left \lfloor \frac{m}{d} \right \rfloor }{j} \right \rfloor
\
\end{align}
我们用$O(n^{1.5})$预处理$d(n) = \sum_{i=1}^{n} \left \lfloor \frac{n}{i} \right \rfloor$,然后就解决拉(其实是可以乱搞一下然后用线性筛筛的)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Lim=50000, N=50005;
int p[N], np[N], pcnt, mu[N];
ll d[N];
void init() {
mu[1]=1;
for(int i=2; i<=Lim; ++i) {
if(!np[i]) {
p[pcnt++]=i;
mu[i]=-1;
}
for(int j=0; j<pcnt; ++j) {
int t=p[j]*i;
if(t>Lim) break;
np[t]=1;
if(i%p[j]==0) break;
mu[t]=-mu[i];
}
}
for(int n=1; n<=Lim; ++n) {
for(int i=1, pos=1; i<=n; i=pos+1) {
pos=n/(n/i);
d[n]+=(ll)(pos-i+1)*(n/i);
}
mu[n]+=mu[n-1];
}
}
void work() {
int n, m;
ll ans=0;
scanf("%d%d", &n, &m);
if(n>m) {
swap(n, m);
}
for(int i=1, pos=1; i<=n; i=pos+1) {
pos=min(n/(n/i), m/(m/i));
ans+=(ll)(mu[pos]-mu[i-1])*d[n/i]*d[m/i];
}
printf("%lld\n", ans);
}
int main() {
int T;
scanf("%d", &T);
init();
while(T--) {
work();
}
return 0;
}\]
【BZOJ】3994: [SDOI2015]约数个数和的更多相关文章
- BZOJ 3994: [SDOI2015]约数个数和
3994: [SDOI2015]约数个数和 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 898 Solved: 619[Submit][Statu ...
- BZOJ 3994: [SDOI2015]约数个数和 [莫比乌斯反演 转化]
2015 题意:\(d(i)\)为i的约数个数,求\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m d(ij)\) \(ij\)都爆int了.... 一开始想容斥一下 ...
- 【刷题】BZOJ 3994 [SDOI2015]约数个数和
Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Output T ...
- ●BZOJ 3994 [SDOI2015]约数个数和
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3994 题解: 莫比乌斯反演 (先定义这样一个符号[x],如果x为true,则[x]=1,否则 ...
- bzoj 3994 [SDOI2015]约数个数和——反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3994 \( d(i*j)=\sum\limits_{x|i}\sum\limits_{y|j ...
- BZOJ 3994: [SDOI2015]约数个数和3994: [SDOI2015]约数个数和 莫比乌斯反演
https://www.lydsy.com/JudgeOnline/problem.php?id=3994 https://blog.csdn.net/qq_36808030/article/deta ...
- BZOJ.3994.[SDOI2015]约数个数和(莫比乌斯反演)
题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^md(ij)\] \(Solution\) 有结论:\[d(nm)=\sum_{i|d}\sum_{j|d ...
- 【BZOJ 3994】3994: [SDOI2015]约数个数和(莫比乌斯反演)
3994: [SDOI2015]约数个数和 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接 ...
- [BZOI 3994] [SDOI2015]约数个数和(莫比乌斯反演+数论分块)
[BZOI 3994] [SDOI2015]约数个数和 题面 设d(x)为x的约数个数,给定N.M,求\(\sum _{i=1}^n \sum_{i=1}^m d(i \times j)\) T组询问 ...
随机推荐
- 面试题目——《CC150》排序与查找
面试题11.1:给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B.编写一个方法,将B合并入A并排序. package cc150.sort_search; public class Me ...
- 面试题目——《CC150》数学与概率
面试题7.2:三角形的三个顶点上各有一只蚂蚁.如果蚂蚁开始沿着三角形的边爬行,两只或三只蚂蚁撞到一起的概率有多大?假定每只蚂蚁会随机选一个方向,每个方向被选到的几率相等,而且三只蚂蚁的爬行速度相同. ...
- Web编程基础--HTML、CSS、JavaScript 学习之课程作业“仿360极速浏览器新标签页”
Web编程基础--HTML.CSS.JavaScript 学习之课程作业"仿360极速浏览器新标签页" 背景: 作为一个中专网站建设出身,之前总是做静态的HTML+CSS+DIV没 ...
- [java] 可视化日历的实现(基于Calendar类 )
写在前面 博文安排顺序如下 1.写在前面 2.源码 3.思路 4.相关知识 该小程序是对Date类及其相关类的复习 要求如下图:实现可视化日历 实现思路 1.先从键盘输入指定格式的字符串(str)2. ...
- Confuser.crproj
<?xml version="1.0" encoding="utf-8"?> <project baseDir="bin\Relea ...
- SQL Server附加数据库时报1813错误的解决方案
SQL Server附加数据库时报1813错误的解决方案 无法打开新数据库 'ASR'.CREATE DATABASE 中止. 文件激活失败.物理文件名称'E:\SqlServer\MSSQL\D ...
- PHP 连接 MySQL
PHP 连接 MySQL PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved) PDO (PHP Dat ...
- Android JSON、GSON、FastJson的封装与解析
声明: 1.本帖只提供代码,不深入讲解原理.如果读者想要深入了解,那就不要在这个帖子上浪费时间了 2.客户端用的是Google官方的Volley访问服务器,具体了解Volley请戳 这里 3.本帖三种 ...
- vijos1250 最勇敢的机器人
背景 Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ 描述 机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品. 它们到了一个仓库,里面有n个物品,每个物品都有一个价 ...
- LNMP环境搭建笔记
说明:前面尝试的在ubuntu12.04上搭建的LAMP环境由于开发的需要需要对php的版本进行升级,然而通过apt-get库安装的php的版本是5.3.10,不能满足开发需要.此笔记安装的php的 ...