在这一篇里把所有的套路写全方便自己之后复习。

首先是一个小学生数学:$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]数表的更多相关文章

  1. 洛咕3312 [SDOI2014]数表

    洛咕3312 [SDOI2014]数表 终于独立写出一道题了...真tm开心(还是先写完题解在写的) 先无视a的限制,设\(f[i]\)表示i的约数之和 不妨设\(n<m\) \(Ans=\su ...

  2. luogu P3312 [SDOI2014]数表

    传送门 我们看要求的东西\[\sum_{i=1}^{n}\sum_{j=1}^{m}[\sigma(gcd(i,j))\le a]\sigma(gcd(i,j))\] 然而\(\le a\)比较烦,可 ...

  3. bzoj [SDOI2014]数表 莫比乌斯反演 BIT

    bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[ ...

  4. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  5. 【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)

    3529: [Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有 ...

  6. [luogu P3313] [SDOI2014]旅行

    [luogu P3313] [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神 ...

  7. BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2321  Solved: 1187[Submit][Status ...

  8. 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组

    [BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...

  9. 洛谷 P3312 [SDOI2014]数表 解题报告

    P3312 [SDOI2014]数表 题目描述 有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\( ...

随机推荐

  1. 【leetcode刷题笔记】Reverse Integer

    Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 解题:设定一个变量 ...

  2. dbgrid,datasoure,ClientDataSet的简单应用

    dbgrid是用来在界面上显示数据的,需要连接源dbgrid1.datasource := datasource1; datasource:作为dbgrid,clientDataset的连接桥梁,需要 ...

  3. jsonpath对json数据进行分析校验做接口测试

    在做接口测试的时候, 我们需要对返回的数据进行分析校验, 一般返回的都是json格式的数据, 怎么来解析校验呢? 之前有看过使用递归遍历json数据的, 然后找到了jsonpath, 可以很方便的对j ...

  4. mysql备份,知识点

    1.mysql错误日志 show variables like '%log_error%'; my.cnf中log-error=/tmp/SZDB.err 开启 tail -f 错误日志  观察mys ...

  5. EntityFramework 学习 一 枚举

    1. Convert an existing property to Enum: using (var ctx = new SchoolDBEntities()) { Teacher tchr = n ...

  6. 希尔排序(Shell Sort)

    一.思路 希尔排序是基于插入排序算法,通过允许不相邻的元素进行交换这一简单的改进,使数组变为局部有序,最终再用插入排序. 希尔排序的思想是使数组中任意间隔h的元素都是有序的.这样的数组被称为h有序数组 ...

  7. JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response

    1.  ServletConfig  有一些东西不合适在程序中写死,应该写在web.xml中,比如 文字怎么显示, 访问数据库名 和 密码, servlet要读取的配置文件 等等.. l在Servle ...

  8. Mybatis_学习_00_资源帖

    源码:https://github.com/mybatis/mybatis-3 一.官方 (1)Mybatis官方文档中文版 (2)MyBatis 从入门到精通  书中指定的网络资源 (3)MyBat ...

  9. php 实现分享到QQ空间 新浪微博

    //分享到新浪微博 $('#blog').click(function(){ window.sharetitle = '<%$info.title%>';//标题 window.share ...

  10. MySQL丨删除一张表小常识

    在MySQL里面 ,对于删除一张表里面的所有内容有两种语句: 1.delete from table_name; 2.truncate table table_name; 解析:以上两种方式都可以删除 ...