bzoj [SDOI2014]数表 莫比乌斯反演 BIT
bzoj [SDOI2014]数表 莫比乌斯反演 BIT
链接
思路
\]
\]
\]
\]
\]
d替换k*i
\]
\]
\]
询问按照a排序,每次加入f(k)时候影响的只是能k|d的g(d)
每次修改就是\(O(\sqrt{n}logn)\)
查询也是一样,
总的就是\(O(T\sqrt{n}logn)\)
注意,ll+取模的话,loj会超时,用int的自然溢出就快了三倍(300ms),是int,不是unsigned int。
其他
线性筛约数和
\]
那么
\]
0x00 是个素数
显然\(SD(pri)=pri+1\)
0x01 两两互质
是个积性函数
因为x,y两两互质,所以他们质因子互不相交,所以显然脑补公式
\]
0x02 两两不互质(i%pri[j]!=0)
再开个数组tmp,记录最小质因子因子的贡献\((1+p_1^1+p_1^2+…+p_1^{w_1})\)
因为pri[j]是他的最小质因子(因为这是线性筛)
我们之前求出的i的
\]
现在的\(i*pri[j]\)的SD显然就是
\]
改变的只有最小因子的贡献,tmp的作用就来了
tmp[i]我们已经求出来了,那么
\]
\]
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 6;
int read() {
int x = 0, f = 1; char s = getchar();
for (; s > '9' || s < '0'; s = getchar()) if (s == '-') f = -1;
for (; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
return x * f;
}
int pri[N], tot, vis[N], mu[N];
int f[N], tmp[N];
struct node {
int n, m, a, id;
int ans;
bool operator < (const node &b) const {
return a < b.a;
}
} Q[N];
bool cmp(node a, node b) {
return a.id < b.id;
}
pair<int,int> F[N];
void Euler(int limit) {
f[1] = tmp[1] = mu[1] = 1;
for (int i = 2; i <= limit; ++i) {
if (!vis[i]) {
mu[i] = -1;
pri[++tot] = i;
f[i] = i + 1;
tmp[i] = i + 1;
}
for (int j = 1; j <= tot && i * pri[j] <= limit; ++j) {
vis[i * pri[j]] = 1;
if (i % pri[j] == 0) {
tmp[i * pri[j]] = tmp[i] * pri[j] + 1;
f[i * pri[j]] = f[i] / tmp[i] * tmp[i * pri[j]];
mu[i * pri[j]] = 0;
break;
}
mu[i * pri[j]] = -mu[i];
f[i * pri[j]] = f[i] * f[pri[j]];
tmp[i * pri[j]] = pri[j] + 1;
}
}
for (int i = 1; i <= limit; ++i) {
F[i].first = f[i], F[i].second = i;
}
sort(F + 1, F + 1 + limit);
}
namespace BIT {
int sum[N];
int lowbit(int x) {return x & (-x);}
void add(int x, int ad) {
for (int i = x; i <= 100000; i += lowbit(i)) sum[i] = (sum[i] + ad);
}
int query(int x) {
int ans = 0;
for (int i = x; i >= 1; i -= lowbit(i)) ans = (ans + sum[i]);
return ans;
}
}
int main() {
Euler(100000);
int T = read();
for (int i = 1; i <= T; ++i) {
Q[i].n = read(),Q[i].m = read(),Q[i].a = read(), Q[i].id = i;
}
sort(Q + 1, Q + 1 + T);
int now = 0;
for (int i = 1; i <= T; ++i) {
while (now + 1 <= 100000 && Q[i].a >= F[now + 1].first) {
now++;
for (int j = F[now].second; j <= 100000; j += F[now].second) {
BIT::add(j, mu[j / F[now].second] * F[now].first);
}
}
int ans = 0;
if (Q[i].n > Q[i].m) swap(Q[i].n, Q[i].m);
for (int l = 1, r; l <= Q[i].n; l = r + 1) {
r = min(Q[i].n / (Q[i].n / l), Q[i].m / (Q[i].m / l));
ans += 1LL * (Q[i].n / l) * (Q[i].m / l) * (BIT::query(r) - BIT::query(l - 1));
}
Q[i].ans = ans;
}
sort(Q + 1, Q + 1 + T, cmp);
for (int i = 1; i <= T; ++i) printf("%u\n", Q[i].ans < 0 ? Q[i].ans + 2147483648 : Q[i].ans);
return 0;
}
bzoj [SDOI2014]数表 莫比乌斯反演 BIT的更多相关文章
- BZOJ[Sdoi2014]数表 莫比乌斯反演
[Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2383 Solved: 1229[Submit][Status][Disc ...
- BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2321 Solved: 1187[Submit][Status ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)
题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...
- 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组
[BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...
- 【bzoj3529】[Sdoi2014]数表 莫比乌斯反演+离线+树状数组
题目描述 有一张n×m的数表,其第i行第j列(1 <= i <= n ,1 <= j <= m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...
- bzoj3529: [Sdoi2014]数表 莫比乌斯反演
题意:求\(\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))(gcd(i,j)<=a),f(x)是x的因子和函数\) 先考虑没有限制的情况,考虑枚举gcd为x,那么有\(\ ...
- BZOJ 3529 [Sdoi2014]数表 ——莫比乌斯反演 树状数组
$ans=\sum_{i=1}^n\sum_{j=1}^n\sigma(gcd(i,j))$ 枚举gcd为d的所有数得到 $ans=\sum_{d<=n}\sigma(d)*g(d)$ $g(d ...
- bzoj 3529 数表 莫比乌斯反演+树状数组
题目大意: 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...
随机推荐
- 《Interest Rate Risk Modeling》阅读笔记——第五章:久期向量模型
目录 第五章:久期向量模型 思维导图 久期向量的推导 久期向量 广义久期向量 一些想法 第五章:久期向量模型 思维导图 久期向量的推导 \[ V_0 = \sum_{t=t_1}^{t_n} CF_t ...
- PyQt5笔记之标签
标签 QLabel用于显示文本或图像.没有提供用户交互功能.标签的视觉外观可以通过各种方式进行配置,并且可以用于为另一个窗口小部件指定焦点助记键. 一个QLabel可以包含以下任意内容类型: 内容 设 ...
- laravel中如何执行请求
laravel中如何执行request请求?本篇文章给大家介绍关于laravel中执行请求的方法,需要的朋友可以参考一下,希望对你有所帮助. 我们先来看一下request是什么? 客户端(例如Web浏 ...
- 2018 ACM-ICPC徐州站网络赛 G题
There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xxx , yy ...
- MediaWiki上传文件大小设置
一.概述 MediaWiki默认最大上传文件大小为2M,碰到文件较大需要修改这个限制,需要改为8M. 二.修改php.ini 使用docker运行的MediaWiki,默认是没有php.ini这个文件 ...
- Java : JavaWeb和Tomcat相关
部署:1.直接把项目移动到webapps文件夹下, 用文件夹名访问(如果ROOT文件夹可以直接访问)2.也可以把war包放到webapps文件夹下, tomcat自动解压,但是删除war包必须要停止t ...
- Window与Document
Window 表示一个包含DOM文档的窗口,其 document 属性指向窗口中载入的 DOM文档.使用 document.defaultView 属性可以获取指定文档所在窗口.window作为全局变 ...
- react的标记渲染机制
// ReactUpdates.js - enqueueUpdate(component) function dirtyComponents.push(component); https://jue ...
- 黑科技!仅需 3 行代码,就能将 Gitter 集成到个人网站中,实现一个 IM 即时通讯聊天室功能?
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- WPF 精修篇 动画组TransformGroup
原文:WPF 精修篇 动画组TransformGroup 动画分组 TransformGroup 一个元素可能要有缩放 ScaleTransform和移动 TranslateTransform等多个效 ...