[SDOI 2015]约数个数和
Description
Input
输入文件包含多组测试数据。
Output
T行,每行一个整数,表示你所求的答案。
Sample Input
7 4
5 6
Sample Output
121
HINT
1<=N, M<=50000
题解
先给出一个结论: $$ \sigma_0(ij) = \sum_{a | i} \sum_{b | j} [gcd(a, b) = 1]$$
证明(摘自Ken_He):
我们令 $i = p_1^{a_1} p_2^{a_2} \cdots$ , $j = p_1^{b_1} p_2^{b_2} \cdots$ , $d | ij$ 且 $d = p_1^{c_1} p_2^{c_2} \cdots$ , 则 $c_n \le a_n + b_n$ 。
考虑如何不重复地统计每一个 $d$ : 令 $c_n = A_n + B_n$ , 其中 $A_n$ 和 $B_n$ 分别为 $i$ 和 $j$ 对 $c_n$ 的贡献, 则我们要求 \begin{cases}B_n = 0 & A_n < a_n \\B_n \ge 0 & A_n = a_n\end{cases}
这样一来, $c_n$ 的表示形式就变成唯一的了,因而不会被重复统计。我们再考虑如何统计这样的 $A_n$ 和 $B_n$ :我们令 $A_n' = a_n - A_n$ ,则约束条件变为\begin{cases}B_n = 0 & A_n' \ne 0 \\B_n \ge 0 & A_n' = 0\end{cases}
等价于 $gcd(a, b) = 1$ 。
因此得证。
\begin{aligned}ans&=\sum_{i=1}^N\sum_{j=1}^M\sum_{a\mid i}\sum_{b\mid j}[gcd(a,b)=1]\\&=\sum_{i=1}^N\sum_{j=1}^M\sum_{a\mid i}\sum_{b\mid j}\sum_{d\mid gcd(a,b)}\mu(d)\\&=\sum_{a=1}^N\sum_{b=1}^M\sum_{i=1}^{\left\lfloor\frac{N}{a}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{M}{b}\right\rfloor}\sum_{d\mid gcd(a,b)}\mu(d)\\&=\sum_{d=1}^{min\{N,M\}}\mu(d)\sum_{a=1}^{\left\lfloor\frac{N}{d}\right\rfloor}\sum_{b=1}^{\left\lfloor\frac{M}{d}\right\rfloor}\left\lfloor\frac{N}{ad}\right\rfloor\left\lfloor\frac{M}{bd}\right\rfloor\\&=\sum_{d=1}^{min\{N,M\}}\mu(d)\left(\sum_{a=1}^{\left\lfloor\frac{N}{d}\right\rfloor}\left\lfloor\frac{N}{ad}\right\rfloor\right)\left(\sum_{b=1}^{\left\lfloor\frac{M}{d}\right\rfloor}\left\lfloor\frac{M}{bd}\right\rfloor\right)\end{aligned}
设 $t(x)=\sum_{i=1}^x \left\lfloor\frac{x}{i}\right\rfloor$ ,
显然 $$\Rightarrow ans=\sum_{d=1}^{min\{N,M\}}\mu(d)\cdot t\left(\left\lfloor\frac{N}{d}\right\rfloor\right)\cdot t\left(\left\lfloor\frac{M}{d}\right\rfloor\right)$$
显然我们用 $O(n\sqrt n)$ 预处理出函数 $t$ ,再用 $O(T\sqrt n)$ 回答询问即可。
//It is made by Awson on 2018.1.22
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = ;
void read(int &x) {
char ch; bool flag = ;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || ); ch = getchar());
for (x = ; isdigit(ch); x = (x<<)+(x<<)+ch-, ch = getchar());
x *= -*flag;
}
void write(LL x) {
if (x > ) write(x/);
putchar(x%+);
} int mu[N+], t[N+], n, m; void get_mu() {
int prime[N+], isprime[N+], tot = ;
memset(isprime, , sizeof(isprime)); isprime[] = , mu[] = ;
for (int i = ; i <= N; i++) {
if (isprime[i]) prime[++tot] = i, mu[i] = -;
for (int j = ; j <= tot && i*prime[j] <= N; j++) {
isprime[i*prime[j]] = ;
if (i%prime[j]) mu[i*prime[j]] = -mu[i];
else {mu[i*prime[j]] = ; break; }
}
mu[i] += mu[i-];
}
}
int get_t(int x) {
int ans = ;
for (int i = , last; i <= x; i = last+) {
last = x/(x/i); ans += (last-i+)*(x/i);
}
return ans;
} LL cal(int n, int m) {
if (n > m) Swap(n, m); LL ans = ;
for (int i = , last; i <= n; i = last+) {
last = Min(n/(n/i), m/(m/i));
ans += (LL)(mu[last]-mu[i-])*t[n/i]*t[m/i];
}
return ans;
}
void work() {
read(n), read(m); writeln(cal(n,m));
}
int main() {
int T; read(T); get_mu();
for (int i = ; i <= N; i++) t[i] = get_t(i);
while (T--) work();
return ;
}
[SDOI 2015]约数个数和的更多相关文章
- Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和
下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...
- SDOI 2015 约束个数和
Description: 共\(T \le 5 \times 10^4\)组询问, 每组询问给定\(n\)和\(m\), 请你求出 \[ \sum_{i = 1}^n \sum_{j = 1}^m \ ...
- 「BZOJ 3994」「SDOI 2015」约数个数和「莫比乌斯反演」
题意 设\(d(x)\)为\(x\)的约数个数,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij)\). 题解 首先证个公式: \[d(ij) = \sum_{x|i}\sum_ ...
- 【SDOI 2015】约数个数和
Problem Description 设 \(d(x)\) 为 \(x\) 的约数个数,给定 \(N\).\(M\),求 \[ \sum_{i=1}^N \sum_{j=1}^M d(ij) \] ...
- BZOJ 3994: [SDOI2015]约数个数和 [莫比乌斯反演 转化]
2015 题意:\(d(i)\)为i的约数个数,求\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m d(ij)\) \(ij\)都爆int了.... 一开始想容斥一下 ...
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
- 【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} ...
- hdu1492(约数个数定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1492 这里先讲一下约数个数定理: 对于正整数x,将其质因分解为 x = pow(p1, a) * po ...
- UVA294DIvisors(唯一分解定理+约数个数)
题目链接 题意:输入两个整数L,U(L <= U <= 1000000000, u - l <= 10000),统计区间[L,U]的整数中哪一个的正约数最多,多个输出最小的那个 本来 ...
随机推荐
- 《团队-Android手机便签-项目进度》
首先想提个小意见,结对编程那边还有些问题需要处理,这个时候就催团队进度是不是不太好,至少应该让我们把结对处理完是吧.但是作业终究是作业,布置了就得做,我们只得匆匆忙忙画了个界面,功能什么的根本没来得及 ...
- 学号:201621123032 《Java程序设计》第9周学习总结(
1:本周学习总结 1.1:以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容 2:书面作业 2.1: List中指定元素的删除(题集题目) 2.1.1:实验总结.并回答:列举至少2种在List ...
- 2018年3月份的PTA(一)
写程序证明p++等价于(p)++还是等价于(p++)? 由程序说明p++等价于(p)++,因为(p++)在程序中是没有地址的,而输出中p++和(p)++的地址不同是由于在线C语言开发环境地址是动态的 ...
- 团队作业7——第二次项目冲刺(Beta版本12.04)
1.当天站立式会议照片 本次会议内容:1:每个人汇报自己完成的工作.2:组长分配各自要完成的任务. 2.每个人的工作 黄进勇:项目整合,后台代码. 李勇:前台界面优化. 何忠鹏:数据库模块. 郑希彬: ...
- Argparse简易教程
Argparse简易教程 原文:Argparse Tutorial 译者:likebeta 本教程是对于Python标准库中推荐使用的命令行解析模块argparse的简单介绍. PS:还有其他两个模块 ...
- 【iOS】swift 枚举
枚举语法 你可以用enum开始并且用大括号包含整个定义体来定义一个枚举: enum SomeEnumeration { // 在这里定义枚举 } 这里有一个例子,定义了一个包含四个方向的罗盘: enu ...
- 【iOS】OC-Quartz2D简单使用
什么是Quartz2D Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 作用 ? 1 2 3 4 5 6 7 8 9 <code>Quartz 2D能完成的工作 绘制图形 ...
- nyoj 黑色帽子
黑色帽子 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 最近发现了一个搞笑的游戏,不过目前还没玩过.一个舞会上,每个人头上都戴着一顶帽子,帽子只有黑 ...
- 学习less
什么是less?LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编写和维护. less哪 ...
- 《javascript设计模式与开发实践》阅读笔记(14)—— 中介者模式
中介者模式 数个对象之间的通信全部委托一个中介者完成.适用于对象之间互相引用,关系错综复杂的情况. 什么情况下需要使用中介者模式 对象较多,且对象间会相互引用,当一个对象的某个状态改变时,得通知其他对 ...