[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自动机的转移建出来,准确地说建出 ...
随机推荐
- Vue项目使用CDN优化首屏加载
前言 作为一个网站应用,加载速度是非常重要的.加载速度,一个是程序的合理安排,如以组件按需加载,一个是js.css等资源的异步加载. 在Vue项目中,引入到工程中的所有js.css文件,编译时都会被打 ...
- django之urls系统
Django的urls系统简介 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映 ...
- 基础补充:使用xlrd模块读取excel文件
因为接口测试用例使用excel文件来维护的,所以有必要学习下操作excel的基本方法 参考博客:python 3 操作 excel 把自己练习的代码贴出来,是一些基本的操作,每行代码后面都加了注释. ...
- Beta第一天
听说
- C语言博客作业—嵌套循环
一.PTA实验作业 题目1:7-4 换硬币 1. 本题PTA提交列表 2. 设计思路 (1)定义整型变量money表示待换的零钱总额,p5表示5分硬币的数量,p2表示2分硬币的数量,p1表示1分硬币的 ...
- Beta冲刺第三天
一.昨天的困难 没有困难. 二.今天进度 1.林洋洋:修改权限相关的资源表示,修复flex布局排版高度问题,修复文件更新问题,去除登录页面的默认账号密码,服务器部署. 2.黄腾达:修复日程首次执行时间 ...
- 1013团队Beta冲刺day6
项目进展 李明皇 今天解决的进度 进行前后端联动调试 明天安排 完善程序运行逻辑 林翔 今天解决的进度 服务器端发布消息,删除消息,检索消息,个人发布的action 明天安排 图片功能遇到问题,微信小 ...
- 用virtualenv建立多个Python独立开发环境
不同的人喜欢用不同的方式建立各自的开发环境,但在几乎所有的编程社区,总有一个(或一个以上)开发环境让人更容易接受. 使用不同的开发环境虽然没有什么错误,但有些环境设置更容易进行便利的测试,并做一些重复 ...
- Syabse数据库无法启动的解决方案
在探讨本问题之前,首先要为大家解释一下Syabse数据库本身.Syabse数据库应用和本身的架构相对而言都相对比较复杂,多数技术人员及公司对Sybase数据库底层结构和运行机制也处于并非完全了解的阶段 ...
- jsp文件调用本地文件的方法(Tomcat server.xml 设置虚拟目录)
JSP文件: <video id="my-video" class="video-js" controls preload="auto" ...