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

链接

bzoj

luogu

loj

思路

\[\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[gcd(i,j)]<=a]
\]

\[f[]可以O(n)预处理出来
\]

\[\sum\limits_{k=1}^{n}f[k]*\sum\limits_{i=1}^{m}\sum\limits_{j=1}^{m}[gcd(i,j)==k]
\]

\[\sum\limits_{k=1}^{n}f[k]*\sum\limits_{i=1}^{\frac{n}{k}}{\frac{n}{ki}}{\frac{m}{ki}}\mu(i)
\]

\[\sum\limits_{i=1}^{n}f[i]*\sum\limits_{k|d}{\frac{n}{d}\frac{m}{d}}\mu(\frac{d}{i})
\]

d替换k*i

\[\sum\limits_{d=1}^{n} \frac{n}{d} \frac{m}{d} \sum\limits_{k|d} \mu(\frac{d}{k})f(k)
\]

\[\sum\limits_{d=1}^{n} \frac{n}{d} \frac{m}{d} g(d)
\]

\[g(d)=\sum\limits_{k|d} \mu(\frac{d}{k})f(k)
\]

询问按照a排序,每次加入f(k)时候影响的只是能k|d的g(d)

每次修改就是\(O(\sqrt{n}logn)\)

查询也是一样,

总的就是\(O(T\sqrt{n}logn)\)

注意,ll+取模的话,loj会超时,用int的自然溢出就快了三倍(300ms),是int,不是unsigned int。

其他

线性筛约数和

\[x=p_{1}^{w_1}p_{2}^{w_2}…p_{k}^{w_k}
\]

那么

\[SD(x)=约数和=(1+p_1^1+p_1^2+…+p_1^{w_1})(1+p_2^1+p_2^2+…+p_2^{w_2})(1+p_k^1+p_k^2+…+p_k^{w_k})
\]

0x00 是个素数

显然\(SD(pri)=pri+1\)

0x01 两两互质

是个积性函数

因为x,y两两互质,所以他们质因子互不相交,所以显然脑补公式

\[SD(x*y)=SD(x)*SD(y)(gcd(x,y)==1)
\]

0x02 两两不互质(i%pri[j]!=0)

再开个数组tmp,记录最小质因子因子的贡献\((1+p_1^1+p_1^2+…+p_1^{w_1})\)

因为pri[j]是他的最小质因子(因为这是线性筛)

我们之前求出的i的

\[SD(i)=(1+p_1^1+p_1^2+…+p_1^{w_1})(1+p_2^1+p_2^2+…+p_2^{w_2})(1+p_k^1+p_k^2+…+p_k^{w_k})
\]

现在的\(i*pri[j]\)的SD显然就是

\[SD(i*pri[j])=(1+p_1^1+p_1^2+…+p_1^{w_1}+p_1^{w_1+1})(1+p_2^1+p_2^2+…+p_2^{w_2})(1+p_k^1+p_k^2+…+p_k^{w_k})
\]

改变的只有最小因子的贡献,tmp的作用就来了

tmp[i]我们已经求出来了,那么

\[tmp[i*pri[j]]=tmp[i]*pri[j]+1(这是个等差数列)
\]

\[SD[i*pri[j]]=SD[i]/tmp[i]*tmp[i*pri[j]]
\]

代码

#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的更多相关文章

  1. BZOJ[Sdoi2014]数表 莫比乌斯反演

    [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2383  Solved: 1229[Submit][Status][Disc ...

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

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

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

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

  4. BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)

    题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...

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

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

  6. 【bzoj3529】[Sdoi2014]数表 莫比乌斯反演+离线+树状数组

    题目描述 有一张n×m的数表,其第i行第j列(1 <= i <= n ,1 <= j <= m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...

  7. bzoj3529: [Sdoi2014]数表 莫比乌斯反演

    题意:求\(\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))(gcd(i,j)<=a),f(x)是x的因子和函数\) 先考虑没有限制的情况,考虑枚举gcd为x,那么有\(\ ...

  8. 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 ...

  9. bzoj 3529 数表 莫比乌斯反演+树状数组

    题目大意: 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...

随机推荐

  1. sublime-text-3-build-3207 破解+注册码

    按照以下步骤依次进行 打开 https://hexed.it/ 单机 "Open file" 并选择 "sublime_text.exe" 可执行文件. 转到 ...

  2. [转帖]腾讯云TStack获下一代云计算技术创新奖 与鲲鹏等产品实现兼容性测试

    http://www.techweb.com.cn/cloud/2019-12-16/2769286.shtml [TechWeb]12 月 16 日消息,在中国电子技术标准化研究院主办的“第九届中国 ...

  3. kubernetes之coredns玩法

    一.概述 新版本的kubernetes默认使用了coredns,这里就不赘述了.直达车:https://coredns.io/.https://kubernetes.io/docs/tasks/adm ...

  4. 搭建RocketMQ集群

    一.环境及准备 集群环境: 软件版本: 部署前操作: 关闭防火墙,关闭selinux(生产环境按需关闭或打开) 同步服务器时间,选择公网ntpd服务器或者自建ntpd服务器 [root@es1 ~]# ...

  5. 【docker】centos7 上拉取docker镜像,一直拉取不到,报错:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while w

    镜像拉取一直报错: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request cancel ...

  6. request.setAttribute()的用法

    分类专栏: Java   request在当次的请求的url之间有效一次传参数,速度快,缺点是参数只能取一次 forward是转向,将现在的请求转交,他只能在同一个容器里使用同时保存客户的请求状态. ...

  7. WebService--导出excel并将excel发送到邮箱

    1.利用NPOI生成EXCEL 2.导出excel之后发送邮件 //导出excel //path :保存路径 //dt:要导出的数据 public static bool DataTableToExc ...

  8. jq处理动画累加

    问题:日程提醒(跟日历一样的切换效果),只用一个div来展示当天日程数据,每次清空div里的数据再加载数据,导致切换日期时,数据展示div有闪动,于是采用动画来进行过渡,这样就巧妙地避免了闪动: $( ...

  9. [個人紀錄] regular 搜集

    判斷有理數 ^(0|[1-9]([0-9]{1,5})?)((\.(([0-9]{1,5})?[1-9])))?$

  10. EF core的原生SQL查询以及用EF core进行分页查询遇到的问题

    在用.net core进行数据库访问,需要处理一些比较复杂的查询,就不得不用原生的SQL查询了,然而EF Core 和EF6 的原生sql查询存在很大的差异. 在EF6中我们用SqlQuery和Exe ...