「BZOJ 3994」「SDOI 2015」约数个数和「莫比乌斯反演」
题意
设\(d(x)\)为\(x\)的约数个数,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij)\)。
题解
首先证个公式:
\]
可以这么考虑:利用唯一分解定理把\(i,j\)分解,即:
$i=\prod_{k = 1}^{m} p_k{c_k},j=\prod_{k=1}m p_k^{d_k} $
那等式左边显然为\(\prod(c_k+d_k+1)\),
然后考虑等式右边在干什么事情:约数的最大公约数为\(1\)。
我们把\(x,y\)分解以后\(p_k\)的指数分别记为\(a_k,b_k\)
这就是说对于每个\(p_k\),\(a_k,b_k\)最多有一个大于\(0\)。
那每一位分成三种情况,\(a_k=b_k=0\);\(a_k\in[1,c_k]\)且\(b_k=0\);\(a_k=0\)且\(b_k\in[1,d_k]\)
然后根据乘法原理乘起来,得到的结果和左边一样,就证出来了
然后带进去化简式子:(假设\(n\leq m\))
\]
\]
\]
\]
这里利用整除的小性质:\(\lfloor\frac{\lfloor \frac{a}{b} \rfloor}{c} \rfloor=\lfloor\frac{\lfloor\frac{a}{c}\rfloor}{b}\rfloor\)
\]
记\(f(n)=\sum_{i=1}^n\lfloor \frac{n}{i} \rfloor\),则答案为\(\sum_{d=1}^n \mu(d)f(\lfloor \frac{n}{d} \rfloor) f(\lfloor \frac{m}{d} \rfloor)\)
这里如果\(f\)通过数论分块预处理,虽然可以过但是显然不够优美,可以换个角度考虑
这个式子的意义是,对于每个\(i\)统计它\(\leq n\)的所以倍数。那么每个数会被统计\(d(i)\)次(\(d\)为约数个数),因此:
\(f(n)=\sum_{i=1}^n d(i)\)
就可以线性筛预处理\(d\)的前缀和,还要预处理\(\mu\)的前缀和,然后每次数论分块。
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N = 5e4 + 10;
ll sum[N], mu[N], d[N];
int p[N], tot, e[N];
bool tag[N];
void init(int n) {
mu[1] = d[1] = 1;
for(int i = 2; i <= n; i ++) {
if(!tag[i]) {
p[tot ++] = i; mu[i] = -1; d[i] = 2; e[i] = 1;
}
for(int j = 0; j < tot && i * p[j] <= n; j ++) {
tag[i * p[j]] = 1;
if(i % p[j] == 0) {
mu[i * p[j]] = 0;
e[i * p[j]] = e[i] + 1;
d[i * p[j]] = d[i] / (e[i] + 1) * (e[i] + 2);
break ;
}
mu[i * p[j]] = - mu[i];
e[i * p[j]] = 1;
d[i * p[j]] = d[i] * 2;
}
mu[i] += mu[i - 1];
d[i] += d[i - 1];
}
}
ll calc(int n, int m) {
ll ans = 0;
for(int i = 1, j; i <= n; i = j + 1) {
j = min(n / (n / i), m / (m / i));
ans += (mu[j] - mu[i - 1]) * d[n / i] * d[m / i];
}
return ans;
}
int main() {
init(50000);
int test; scanf("%d", &test);
for(int n, m; test --; ) {
scanf("%d%d", &n, &m);
if(n > m) swap(n, m);
printf("%lld\n", calc(n, m));
}
return 0;
}
「BZOJ 3994」「SDOI 2015」约数个数和「莫比乌斯反演」的更多相关文章
- 【BZOJ 3994】3994: [SDOI2015]约数个数和(莫比乌斯反演)
3994: [SDOI2015]约数个数和 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接 ...
- 【SDOI 2015】约数个数和
Problem Description 设 \(d(x)\) 为 \(x\) 的约数个数,给定 \(N\).\(M\),求 \[ \sum_{i=1}^N \sum_{j=1}^M d(ij) \] ...
- bzoj 2005 & 洛谷 P1447 [ Noi 2010 ] 能量采集 —— 容斥 / 莫比乌斯反演
题目:bzoj 2005 https://www.lydsy.com/JudgeOnline/problem.php?id=2005 洛谷 P1447 https://www.luogu.org/ ...
- 「BZOJ 3529」「SDOI 2014」数表「莫比乌斯反演」
题意 有一张 \(n\times m\) 的数表,其第\(i\)行第\(j\)列的数值为能同时整除\(i\)和\(j\)的所有自然数之和. \(T\)组数据,询问对于给定的 \(n,m,a\) , 计 ...
- ☆ [POI2007] ZAP-Queries 「莫比乌斯反演」
题目类型:莫比乌斯反演 传送门:>Here< 题意:求有多少对正整数对\((a,b)\),满足\(0<a<A\),\(0<b<B\),\(gcd(a,b)=d\) ...
- 「CF235E」Number Challenge「莫比乌斯反演」
一个结论:(从二维扩展来的,三维也是对的,证明可以考虑质因数分解) \[ d(ijk)=\sum_{i'|i}\sum_{j'|j}\sum_{k'|k}[\gcd(i',j')=1][\gcd(i' ...
- 【BZOJ 3993】【SDOI 2015】星际战争
http://www.lydsy.com/JudgeOnline/problem.php?id=3993 调了好长时间啊 这道题设时间为time,那么对于m个武器从S向这m个点连容量为time*Bi的 ...
- BZOJ 4089:[Sdoi2015]graft(SDOI 2015 Round 2 Day 2)
别人家的神选系列,我只会做这道题QAQ 题目描述: 给定一颗树,加上k条边,将n个点染色,相邻两点不同,记颜色为i的又ti个,求$$\frac{\sum_{i=1}^{n} \frac{ti}{i}} ...
- 【BZOJ 3993】【SDOI 2015】序列统计
http://www.lydsy.com/JudgeOnline/problem.php?id=3992 这道题好难啊. 第一眼谁都能看出来是个dp,设\(f(i,j)\)表示转移到第i位时前i位的乘 ...
随机推荐
- PHP:JSON字符串转换为中文,中文转换为JSON字符串
/** * 中文转换为JSON字符串 * @param $chinese_str 中文:可以包含中文字母数字 * @return string */ function json_encode($chi ...
- 蓝桥杯 算法训练 ALGO-125 王、后传说
算法训练 王.后传说 时间限制:1.0s 内存限制:256.0MB 问题描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道, ...
- Python运行错误解释
BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 StopIte ...
- 第十章 深入理解Session与Cookie
理解Cookie 理解Session Cookie安全问题 分布式Session框架 Cookie压缩 表单重复提交问题 多终端Session统一
- python获得当前工作目录和修改
import os curDir = os.getcwd() 最近使用Python 写了很多脚本,想导入脚本,发现不知道如何查看python 的默认工作目录,并修改默认工作目录. 方法/步骤 查 ...
- hadoop 常用端口 及模块介绍
50070 namenode http port 50075 datanode http port 50090 ...
- Javascript 面向对象(一):封装
Javascript 面向对象编程(一):封装 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言, ...
- PagerSlidingTabStrip(viewPage滑动菜单)
Github地址:https://github.com/astuetz/PagerSlidingTabStrip 1,Include the library dependencies { compil ...
- Comparatable接口和Comparator接口的使用与区别
这篇博文可以为你解决的问题如下: 什么是自然排序 Collections.sort()与Arrays.sort()的异同点 Comparatable接口和Comparator接口各自的排序依据(理论讲 ...
- 百度Apollo解析——0.使用VSCode编译Apollo项目
1.安装微软Visual Studio Code 1.1 方法一 开始之前,首先需要安装Ubuntu Make.虽然Ubuntu Make存在Ubuntu15.04官方库中,但是需要Ubuntu Ma ...