Luogu 3312 [SDOI2014]数表
在这一篇里把所有的套路写全方便自己之后复习。
首先是一个小学生数学:$a$整除$b$ $ = $ $\frac{b}{a}$
也就是说这题中格子$(i, j)$的值就是既能被$i$整除又能被$j$整除的所有自然数的和。
小学数学没学好……
那么思考一下就能列出本题的式子:
$\sum_{i = 1}^{n}\sum_{j = 1}^{m}f(gcd(i, j))$ 假设$n \leq m$并且$f(gcd(i, j)) \leq a$
$f(i)$表示$i$的约数和
发现$a$的限制十分讨厌,先不考虑它把式子推出来。
先枚举$d$
$\sum_{d = 1}^{n}f(d)\sum_{i = 1}^{n}\sum_{j = 1}^{m}[gcd(i, j) == d]$
后面直接枚举$d$的倍数
$\sum_{d = 1}^{n}f(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]$
在这里可以把$[gcd(i, j) == 1]$进行单位元代换了
$\sum_{d = 1}^{n}f(d)\sum_{i = 1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j = 1}^{\left \lfloor \frac{m}{d} \right \rfloor}\sum_{t | gcd(i, j)}\mu (t)$
枚举$t$
$\sum_{d = 1}^{n}f(d)\sum_{t = 1}^{\left \lfloor \frac{n}{d} \right \rfloor}\mu (t)\sum_{i = 1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j = 1}^{\left \lfloor \frac{m}{d} \right \rfloor}[t|gcd(i, j)]$
后面直接枚举$t$的倍数
$\sum_{d = 1}^{n}f(d)\sum_{t = 1}^{\left \lfloor \frac{n}{d} \right \rfloor}\mu (t)\left \lfloor \frac{n}{td} \right \rfloor\left \lfloor \frac{m}{td} \right \rfloor$
枚举$T = dt$
$\sum_{T = 1}^{n}\left \lfloor \frac{n}{T} \right \rfloor\left \lfloor \frac{m}{T} \right \rfloor\sum_{d | T}\mu (\frac{T}{d})f(d)$
记$h(T) = \sum_{d | T}\mu (\frac{T}{d})f(d)$
$\sum_{T = 1}^{n}\left \lfloor \frac{n}{T} \right \rfloor\left \lfloor \frac{m}{T} \right \rfloor h(T)$
$h(i)$显然可以线性筛,如果不考虑$a$的情况下已经可以整除分块$\sqrt{n}$求解了。
现在考虑$a$的限制,发现只有当$f(i) \leq a$的时候才会对答案产生贡献,我们可以将所有询问离线,按照$a$从小到大排序,然后写一个支持单点修改区间查询的数据结构来做这个产生贡献的$h(i)$的前缀和的计算。
当然是常数小又好写的$bit$啦。
时间复杂度$O(q\sqrt{n}log\ MaxN + MaxNlogMaxN)$。
在本题中取模只要让$int$自然溢出,最后再& $2^{31} - 1$。
Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair <int, int> pin; const int N = 1e5 + ;
const int M = 2e4 + ; int qn, maxn = , pCnt = , pri[N], low[N], mu[N], d[N];
bool np[N];
pin f[N]; struct Querys {
int n, m, r, id, ans;
} q[M]; bool cmp(const Querys &x, const Querys &y) {
return x.r < y.r;
} inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMax(int &x, int y) {
if(y > x) x = y;
} inline int min(int x, int y) {
return x > y ? y : x;
} inline void sieve() {
mu[] = d[] = ;
for(int i = ; i <= maxn; i++) {
if(!np[i]) pri[++pCnt] = i, mu[i] = -, d[i] = + i, low[i] = i;
for(int j = ; j <= pCnt && pri[j] * i <= maxn; j++) {
np[i * pri[j]] = ;
if(i % pri[j] == ) {
low[i * pri[j]] = low[i] * pri[j];
mu[i * pri[j]] = ;
if(low[i] == i) d[i * pri[j]] = d[i] * pri[j] + ;
else d[i * pri[j]] = d[i / low[i]] * d[pri[j] * low[i]];
break;
}
low[i * pri[j]] = pri[j];
mu[i * pri[j]] = -mu[i];
d[i * pri[j]] = d[i] * d[pri[j]];
}
} /* for(int i = 1; i <= 20; i++)
printf("%d ", mu[i]);
printf("\n");
for(int i = 1; i <= 20; i++)
printf("%d ", d[i]);
printf("\n"); */ for(int i = ; i <= maxn; i++)
f[i].first = d[i], f[i].second = i;
sort(f + , f + + maxn);
} namespace BinaryIndexTree {
int s[N]; #define lowbit(p) (p & (-p)) inline void modify(int p, int v) {
for(; p <= maxn; p += lowbit(p))
s[p] += v;
} inline int query(int p) {
int res = ;
for(; p > ; p -= lowbit(p))
res += s[p];
return res;
} } using namespace BinaryIndexTree; inline void solve() {
sort(q + , q + + qn, cmp);
int now = ;
for(int i = ; i <= qn; i++) {
int rep = min(q[i].n, q[i].m), res = ; for(; now + <= maxn && f[now + ].first <= q[i].r; ) {
++now;
for(int j = f[now].second; j <= maxn; j += f[now].second)
modify(j, f[now].first * mu[j / f[now].second]);
} for(int l = , r; l <= rep; l = r + ) {
r = min((q[i].n / (q[i].n / l)), (q[i].m / (q[i].m / l)));
res += (q[i].n / l) * (q[i].m / l) * (query(r) - query(l - ));
}
q[q[i].id].ans = res;
}
} int main() {
read(qn);
for(int i = ; i <= qn; i++) {
read(q[i].n), read(q[i].m), read(q[i].r);
q[i].id = i;
chkMax(maxn, q[i].n), chkMax(maxn, q[i].m);
} sieve();
solve(); for(int i = ; i <= qn; i++)
printf("%d\n", q[i].ans & (0x7fffffff));
return ;
}
Luogu 3312 [SDOI2014]数表的更多相关文章
- 洛咕3312 [SDOI2014]数表
洛咕3312 [SDOI2014]数表 终于独立写出一道题了...真tm开心(还是先写完题解在写的) 先无视a的限制,设\(f[i]\)表示i的约数之和 不妨设\(n<m\) \(Ans=\su ...
- luogu P3312 [SDOI2014]数表
传送门 我们看要求的东西\[\sum_{i=1}^{n}\sum_{j=1}^{m}[\sigma(gcd(i,j))\le a]\sigma(gcd(i,j))\] 然而\(\le a\)比较烦,可 ...
- bzoj [SDOI2014]数表 莫比乌斯反演 BIT
bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[ ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- 【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)
3529: [Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有 ...
- [luogu P3313] [SDOI2014]旅行
[luogu P3313] [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神 ...
- BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2321 Solved: 1187[Submit][Status ...
- 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组
[BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...
- 洛谷 P3312 [SDOI2014]数表 解题报告
P3312 [SDOI2014]数表 题目描述 有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\( ...
随机推荐
- 【leetcode刷题笔记】Reverse Integer
Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 解题:设定一个变量 ...
- dbgrid,datasoure,ClientDataSet的简单应用
dbgrid是用来在界面上显示数据的,需要连接源dbgrid1.datasource := datasource1; datasource:作为dbgrid,clientDataset的连接桥梁,需要 ...
- jsonpath对json数据进行分析校验做接口测试
在做接口测试的时候, 我们需要对返回的数据进行分析校验, 一般返回的都是json格式的数据, 怎么来解析校验呢? 之前有看过使用递归遍历json数据的, 然后找到了jsonpath, 可以很方便的对j ...
- mysql备份,知识点
1.mysql错误日志 show variables like '%log_error%'; my.cnf中log-error=/tmp/SZDB.err 开启 tail -f 错误日志 观察mys ...
- EntityFramework 学习 一 枚举
1. Convert an existing property to Enum: using (var ctx = new SchoolDBEntities()) { Teacher tchr = n ...
- 希尔排序(Shell Sort)
一.思路 希尔排序是基于插入排序算法,通过允许不相邻的元素进行交换这一简单的改进,使数组变为局部有序,最终再用插入排序. 希尔排序的思想是使数组中任意间隔h的元素都是有序的.这样的数组被称为h有序数组 ...
- JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response
1. ServletConfig 有一些东西不合适在程序中写死,应该写在web.xml中,比如 文字怎么显示, 访问数据库名 和 密码, servlet要读取的配置文件 等等.. l在Servle ...
- Mybatis_学习_00_资源帖
源码:https://github.com/mybatis/mybatis-3 一.官方 (1)Mybatis官方文档中文版 (2)MyBatis 从入门到精通 书中指定的网络资源 (3)MyBat ...
- php 实现分享到QQ空间 新浪微博
//分享到新浪微博 $('#blog').click(function(){ window.sharetitle = '<%$info.title%>';//标题 window.share ...
- MySQL丨删除一张表小常识
在MySQL里面 ,对于删除一张表里面的所有内容有两种语句: 1.delete from table_name; 2.truncate table table_name; 解析:以上两种方式都可以删除 ...