【bzoj3529】[Sdoi2014]数表 莫比乌斯反演+离线+树状数组
题目描述
有一张n×m的数表,其第i行第j列(1 <= i <= n ,1 <= j <= m)的数值为能同时整除i和j的所有自然数之和。给定a,计算数表中不大于a的数之和。
输入
输入包含多组数据。
输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据。
输出
对每组数据,输出一行一个整数,表示答案模2^31的值。
样例输入
2
4 4 3
10 10 5
样例输出
20
148
题解
莫比乌斯反演+离线+树状数组
设 $f(n)$ 表示 $n$ 的约数和,当约数和大于 $a$ 时将其视作0。
那么我们要求的就是 $\sum\limits_{i=1}^n\sum\limits_{j=1}^mf(\gcd(i,j))$
于是有以下公式推导(为了方便,以下默认 $n\le m$):
$\ \ \ \ \sum\limits_{i=1}^n\sum\limits_{j=1}^mf(\gcd(i,j))\\=\sum\limits_{d=1}^nf(d)\sum\limits_{i=1}^n\sum\limits_{j=1}^m[\gcd(i,j)=d]\\=\sum\limits_{d=1}^nf(d)\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor\frac md\rfloor}[\gcd(i,j)=1]\\=\sum\limits_{d=1}^nf(d)\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor\frac md\rfloor}\sum\limits_{p|i\&p|j}\mu(p)\\=\sum\limits_{d=1}^nf(d)\sum\limits_{p=1}^{\lfloor\frac nd\rfloor}\mu(p)\lfloor\frac n{dp}\rfloor\lfloor\frac m{dp}\rfloor$
然后再设 $D=dp$ 则有:
$\ \ \ \ \sum\limits_{d=1}^nf(d)\sum\limits_{p=1}^{\lfloor\frac nd\rfloor}\mu(p)\lfloor\frac n{dp}\rfloor\lfloor\frac m{dp}\rfloor\\=\sum\limits_{D=1}^n\lfloor\frac nD\rfloor\lfloor\frac mD\rfloor\sum\limits_{d|D}f(d)\mu(\frac Dd)$
此时如果所有的询问的 $a$ 都相同,这道题就做完了。预处理出 $f(n)$ 和 $\mu(n)$ ,并用 $O(n\ln n)$ 的时间内算出所有的 $\sum\limits_{d|n}f(d)\mu(\frac nd)$ ,求出其前缀和。然后对每个询问枚举商,分块处理即可。
那么如果 $a$ 不同呢?考虑离线,把所有询问按照 $a$ 从小到大排序,把所有数按照 $f$ 值从小到大排序,对于每一次 $a$ 的改变,在所有数中移动指针 $p$。那么每次指针 $p$ 移动就相当于是把 $f(p)$ 的贡献都算上。由于每个数只被扫到一次,因此只需要修改 $n\ln n$ 个 $\sum\limits_{d|n}f(d)\mu(\frac nd)$ 。
而我们需要动态维护前缀和,需要支持修改,因此使用树状数组来维护即可。
模 $2^{30}$ 的话可以先unsigned int自然溢出(相当于模$2^{31}$),最后答案再对 $2^{30}-1$取与。
时间复杂度 $O(n\log^2n+Q\sqrt n\log n)$
#include <cstdio>
#include <algorithm>
#define N 100010
#define n 100000
using namespace std;
typedef unsigned int ui;
struct data
{
ui p , q , v , pos;
bool operator<(const data &a)const {return v < a.v;}
}a[N];
ui mu[N] , prime[N] , tot , np[N] , s[N] , id[N] , f[N] , ans[N];
bool cmp(ui a , ui b)
{
return s[a] < s[b];
}
inline void add(ui x , ui a)
{
ui i;
for(i = x ; i <= n ; i += i & -i) f[i] += a;
}
inline ui query(ui x)
{
ui i , ans = 0;
for(i = x ; i ; i -= i & -i) ans += f[i];
return ans;
}
int main()
{
ui m , i , j , last , p = 1;
int x;
mu[1] = 1;
for(i = 2 ; i <= n ; i ++ )
{
if(!np[i]) mu[i] = -1 , prime[++tot] = i;
for(j = 1 ; j <= tot && i * prime[j] <= n ; j ++ )
{
np[i * prime[j]] = 1;
if(!(i % prime[j]))
{
mu[i * prime[j]] = 0;
break;
}
else mu[i * prime[j]] = -mu[i];
}
}
for(i = 1 ; i <= n ; i ++ )
{
id[i] = i;
for(j = i ; j <= n ; j += i)
s[j] += i;
}
sort(id + 1 , id + n + 1 , cmp);
scanf("%u" , &m);
for(i = 1 ; i <= m ; i ++ )
{
scanf("%u%u%u" , &a[i].p , &a[i].q , &x) , a[i].pos = i;
if(x > 0) a[i].v = x;
else a[i].v = 0;
}
sort(a + 1 , a + m + 1);
for(i = 1 ; i <= m ; i ++ )
{
while(p <= n && s[id[p]] <= a[i].v)
{
for(j = 1 ; j * id[p] <= n ; j ++ )
add(j * id[p] , mu[j] * s[id[p]]);
p ++ ;
}
for(j = 1 ; j <= a[i].p && j <= a[i].q ; j = last + 1)
last = min(a[i].p / (a[i].p / j) , a[i].q / (a[i].q / j)) , ans[a[i].pos] += (a[i].p / j) * (a[i].q / j) * (query(last) - query(j - 1));
}
for(i = 1 ; i <= m ; i ++ ) printf("%u\n" , ans[i] & 0x7fffffff);
return 0;
}
【bzoj3529】[Sdoi2014]数表 莫比乌斯反演+离线+树状数组的更多相关文章
- BZOJ3529: [Sdoi2014]数表 莫比乌斯反演_树状数组
Code: #include <cstdio> #include <algorithm> #include <cstring> #define ll long lo ...
- 【BZOJ3529】数表(莫比乌斯反演,树状数组)
[BZOJ3529]数表(莫比乌斯反演,树状数组) 题解 首先不管\(A\)的范围的限制 要求的东西是 \[\sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j))\] 其中\ ...
- BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)
题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...
- 【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)
3529: [Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有 ...
- bzoj3529: [Sdoi2014]数表 莫比乌斯反演
题意:求\(\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))(gcd(i,j)<=a),f(x)是x的因子和函数\) 先考虑没有限制的情况,考虑枚举gcd为x,那么有\(\ ...
- BZOJ3529: [Sdoi2014]数表(莫比乌斯反演,离线)
Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...
- bzoj [SDOI2014]数表 莫比乌斯反演 BIT
bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[ ...
- POJ 3416 Crossing --离线+树状数组
题意: 给一些平面上的点,然后给一些查询(x,y),即以(x,y)为原点建立坐标系,一个人拿走第I,III象限的点,另一个人拿II,IV象限的,点不会在任何一个查询的坐标轴上,问每次两人的点数差为多少 ...
- HDU 2852 KiKi's K-Number(离线+树状数组)
题目链接 省赛训练赛上一题,貌似不难啊.当初,没做出.离线+树状数组+二分. #include <cstdio> #include <cstring> #include < ...
随机推荐
- HBase简介(梳理知识)
一. 简介 hbase是bigtable的开源山寨版本.是建立的hdfs之上,提供高可靠性.高性能.列存储.可伸缩.实时读写的数据库系统.它介于nosql和RDBMS之间,仅能通过主键(row key ...
- 全国Uber优步司机奖励政策 (1月11日-1月17日)
本周已经公开奖励整的城市有:北 京.成 都.重 庆.上 海.深 圳.长 沙.佛 山.广 州.苏 州.杭 州.南 京.宁 波.青 岛.天 津.西 安.武 汉.厦 门,可按CTRL+F,搜城市名快速查找. ...
- [Jmeter并发报错解决方案]org.apache.http.NoHttpResponseException: 10.0.4.147:8000 failed to respond
背景:公司模型框架是Nginx+uwsgi+Django+nginx,一开始使用Jmeter进行高并发请求测试,发现成功率只有50%,换用postman,成功率100%,代码进行高并发一样不会报错. ...
- LeetCode:35. Search Insert Position(Easy)
1. 原题链接 https://leetcode.com/problems/search-insert-position/description/ 2. 题目要求 给定一个已经排好序的数组和一个目标值 ...
- mysql 优化笔记
数据表总共81万条数 SQL explain ); 执行时间超级长,没有等到执行完成就终止了太慢了 explain一下 发现表bb 的select_type 为DEPENDENT SUBQUERY ...
- Java子类与父类之间的类型转换
1.向上转换 父类的引用变量指向子类变量时,子类对象向父类对象向上转换.从子类向父类的转换不需要什么限制,只需直接蒋子类实例赋值给父类变量即可,这也是Java中多态的实现机制. 2.向下转换 在父类变 ...
- HIS系统两种收费模式比较:前计费和后计费
一.药品 a.前计费:审核(临时医嘱)或者分解(长期医嘱)计费 退费处理方式,1)如果是还未发药,则护士站直接退费;2)如果药房已经发药,则护士站发出退费申请,由护士拿着药品去药房退药退费. b.后计 ...
- 在Win10中通过命令行打开UWP应用
近期由于需要在WinX菜单中添加几个UWP应用,但发现很难找到相应的命令行,Universal Apps 的快捷方式属性里也没有. 于是到网上搜了很久才找到一个E文的页面,试了一下确实可行,分享给大家 ...
- 「专题训练」k-Tree(CodeForces Round #247 Div.2 C)
题意与分析(Codeforces-431C) 题意是这样的:给出K-Tree--一个无限增长的树,它的每个结点都恰有\(K\)个孩子,每个节点到它\(K\)个孩子的\(K\)条边的权重各为\(1,2, ...
- fiddler不经意的功能
捕获指定客户端的请求,直接食用 窗口分离,直接食用 Hide this column 隐藏此列Ensure all columns are visible 显示默认所有列Customize co ...