[SDOI 2014]数表
Description
有一张N×m的数表,其第i行第j列(1 < =i < =N,1 < =j < =m)的数值为
能同时整除i和j的所有自然数之和。给定a,计算数表中不大于a的数之和。
Input
输入包含多组数据。
输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据。
Output
对每组数据,输出一行一个整数,表示答案模2^31的值。
Sample Input
4 4 3
10 10 5
Sample Output
148
HINT
1 < =N.m < =10^5 , 1 < =Q < =2×10^4
题解
假设没有 $a$ 的限制,那么题目就是求 $$\sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j))$$
这个 $\sigma$ 太鬼辣!我们用 $♂$ 来代替它。
我们提出 $gcd(i,j)$ \begin{aligned}ans&=\sum_{d=1}^{min\{n,m\}}♂(d)\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=d]\\&=\sum_{d=1}^{min\{n,m\}}♂(d)\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}[gcd(i,j)=1]\\&=\sum_{d=1}^{min\{n,m\}}♂(d)\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}\sum_{k\mid gcd(i,j)}\mu(k)\\&=\sum_{d=1}^{min\{n,m\}}♂(d)\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}\sum_{k\mid gcd(i,j)}\mu(k)\\&=\sum_{d=1}^{min\{n,m\}}♂(d)\sum_{k=1}^{min\left\{\left\lfloor\frac{n}{d}\right\rfloor,\left\lfloor\frac{m}{d}\right\rfloor\right\}}\mu(k)\left\lfloor\frac{n}{kd}\right\rfloor\left\lfloor\frac{m}{kd}\right\rfloor\end{aligned}
令 $T=kd$ ,枚举 $T$ $$ans=\sum_{T=1}^{min\{n,m\}}\left\lfloor\frac{n}{T}\right\rfloor\left\lfloor\frac{m}{T}\right\rfloor\sum_{k\mid T}♂(k)\mu\left(\frac{T}{k}\right)$$
我们让后面那个狄利克雷卷积形式记作 $F(T)$ $$ans=\sum_{T=1}^{min\{n,m\}}F(T)\left\lfloor\frac{n}{T}\right\rfloor\left\lfloor\frac{m}{T}\right\rfloor$$
现在就好求了,我们可以用枚举因数的方法来算出函数 $F$ 的值。
现在回到原问题,我们发现 $a$ 的约束还是不好操作。但我们想对于一个询问中的 $a$ 只有 $♂(d)\leq a$ 的值才会对其有影响。我们考虑离线询问,将 $a$ 从小到大排序。将数值 $i$ 按 $♂(i)$ 的大小排序。枚举因数用树状数组维护前缀。
//It is made by Awson on 2018.1.25
#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 = 1e5;
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(int x) {
if (x > ) write(x/);
putchar(x%+);
} int q, ans[N+], sig[N+], mu[N+];
struct query {
int n, m, a, id;
bool operator < (const query &b) const {
return a < b.a;
}
}a[N+];
struct sigma {
int a, id;
bool operator < (const sigma &b) const {
return a < b.a;
}
}b[N+];
struct bittree {
int c[N+];
void add(int x, int val) {for (; x <= N; x += lowbit(x)) c[x] += val; }
int query(int x) {
int ans = ;
for (; x; x -= lowbit(x)) ans += c[x];
return ans;
}
}T; void get_pre() {
int isprime[N+], prime[N+], tot = , sumd[N+], prod[N+];
memset(isprime, , sizeof(isprime)); isprime[] = , mu[] = sig[] = ; b[].id = b[].a = ;
for (int i = ; i <= N; i++) {
if (isprime[i]) prime[++tot] = i, mu[i] = -, sig[i] = +i, sumd[i] = +i, prod[i] = 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], sig[i*prime[j]] = sig[i]*sig[prime[j]], sumd[i*prime[j]] = +prime[j], prod[i*prime[j]] = prime[j];
else {mu[i*prime[j]] = , prod[i*prime[j]] = prod[i]*prime[j], sumd[i*prime[j]] = sumd[i]+prod[i*prime[j]], sig[i*prime[j]] = sig[i]/sumd[i]*sumd[i*prime[j]]; break; }
}
b[i].id = i, b[i].a = sig[i];
}
}
int solve(int n, int m) {
if (n > m) Swap(n, m); int ans = ;
for (int i = , last; i <= n; i = last+) {
last = Min(n/(n/i), m/(m/i)); ans += (n/i)*(m/i)*(T.query(last)-T.query(i-));
}
return ans;
}
void work() {
get_pre(); read(q);
for (int i = ; i <= q; i++) read(a[i].n), read(a[i].m), read(a[i].a), a[i].id = i;
sort(a+, a++q); sort(b+, b++N);
for (int i = , last = ; i <= q; i++) {
while (last < N && b[last].a <= a[i].a) {
for (int j = ; j*b[last].id <= N; j++) if (mu[j]) T.add(j*b[last].id, mu[j]*b[last].a);
last++;
}
ans[a[i].id] = solve(a[i].n, a[i].m);
}
for (int i = ; i <= q; i++) writeln(ans[i]&(~0u>>));
}
int main() {
work();
return ;
}
[SDOI 2014]数表的更多相关文章
- 解题:SDOI 2014 数表
题面 为了好写式子,先不管$a$的限制 设$facs$为因子和,那么有 $ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^mfacs(gcd(i,j))$ 再设$f( ...
- 「BZOJ 3529」「SDOI 2014」数表「莫比乌斯反演」
题意 有一张 \(n\times m\) 的数表,其第\(i\)行第\(j\)列的数值为能同时整除\(i\)和\(j\)的所有自然数之和. \(T\)组数据,询问对于给定的 \(n,m,a\) , 计 ...
- 【BZOJ 3529】【SDOI 2014】数表
看Yveh的题解,这道题卡了好长时间,一直不明白为什么要······算了当时太naive我现在都不好意思说了 #include<cstdio> #include<cstring> ...
- 【SDOI 2014】数表
题意 https://loj.ac/problem/2193 题解 显然就是求 $\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} \sigma_1(\gcd{ ...
- 【BZOJ 3531】【SDOI 2014】旅行
因为有$10^5$个宗教,需要开$10^5$个线段树. 平时开的线段树是“满”二叉树,但在这个题中代表一个宗教的线段树管辖的区间有很多点都不属于这个宗教,也就不用“把枝叶伸到这个点上”,所以这样用类似 ...
- [BZOJ 3530][Sdoi 2014]数数
阿拉~好像最近总是做到 AC 自动机的题目呢喵~ 题目的算法似乎马上就能猜到的样子…… AC 自动机 + 数位 dp 先暴力转移出 f[i][j] :表示从 AC 自动机上第 j 号节点走 i 步且不 ...
- BZOJ 3533 sdoi 2014 向量集
设(x,y)为Q的查询点,分类讨论如下:1.y>0: 最大化a*x+b*y,维护一个上凸壳三分即可 2.y<0:最大化a*x+b*y 维护一个下凸壳三分即可 我们考虑对时间建出一棵线段 ...
- 解题:SDOI 2014 重建
题面 做这个这个题需要稍微深入理解一点矩阵树定理:套矩阵树定理得到的东西是有意义的,它是“所有生成树边权乘积之和”(因为度数矩阵是点的边权和,邻接矩阵是边权),即$\sum_{t}\prod_{e∈t ...
- 【BZOJ 3530】【SDOI 2014】数数
http://www.lydsy.com/JudgeOnline/problem.php?id=3530 上午gty的测试题,爆0了qwq 类似文本生成器那道题,把AC自动机的转移建出来,准确地说建出 ...
随机推荐
- Visual Studio 2017 Key 激活码
Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Visual Studio 2017(VS201 ...
- 极光征文 | 写写文章就能赢 Filco,岂不美滋滋
由极光社区举办的第二届征文大赛 --「我和极光的那些事儿」又来啦! 在简书平台发布文章并投稿至「我和极光的那些事」专题,只要参与就能 100% 获得京东购物卡,更有机会赢取象征信仰的 Filco 机械 ...
- 网页设计入门<一>
俗话说:技多不压身.实习周,网页设计是之一,边学边总结... 本次网页设计基于Adobe Dreamweaver CS6开发平台,根据实习老师的暴力指导,为什么说暴力呢? 没有基础,没有预告,打开软件 ...
- 实验二Java面向对象程序设计实验报告(2)
实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...
- nyoj 矩形个数
矩形的个数 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3 ...
- [译]RabbitMQ教程C#版 - 工作队列
先决条件 本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难,可以 ...
- Golang学习--开篇
最近开始接收一个新项目,是使用Golang写的,需要重新捡起Golang来,于是就有了这个系列博客. Golang的环境配置,我就不说了,让我们直接开始. Golang官网:https://golan ...
- 爬虫小探-Python3 urllib.request获取页面数据
使用Python3 urllib.request中的Requests()和urlopen()方法获取页面源码,并用re正则进行正则匹配查找需要的数据. #forex.py#coding:utf-8 ' ...
- 在thinkphp框架中使用后台传值过来的数组,在hightcart中使用数组
js的数组是和php里面数组是不一样的,所以模板文件需要先接受,然后利用Js代码转化之后再使用,接受后台的数组有几种办法 1.后台传过来的json数组,利用Js是可以接受的,然后将json数据利用js ...
- Python模块configparser(操作配置文件ini)
configparser模块提供对ini文件的增删改查方法. ini文件的数据格式: [name1] attribute1=value1 attribute2=value2 [name2] attri ...