【BZOJ3529】数表,莫比乌斯反演+BIT
传送门
思路:
复习一下莫比乌斯反演
好像是数论入门题,然后我做了近一天……
式子是这么化没错
n≤mn≤m
\sum^n_{i=1}\sum^m_{j=1}[\sigma(gcd(i,j))≤a]\sigma(gcd(i,j))
=\sum^n_{i=1}\sum^m_{j=1}\sum^n_{d=1}[gcd(i,j)=d][\sigma(d)≤a]\sigma(d)
i=di,j=dji=di,j=dj
=\sum^n_{d=1}[\sigma(d)≤a]\sigma(d)\sum^{\lfloor \frac n d\rfloor}_{i=1}\sum^{\lfloor\frac m d\rfloor}_{j=1}[gcd(i,j)=1]
=\sum^{n}_{d=1}[\sigma(d)≤a]\sigma(d)\sum^{\lfloor \frac n d\rfloor}_{k=1}\mu(k)\lfloor \frac n {kd}\rfloor\lfloor \frac m {kd}\rfloor
一开始我化到这里就停下开始求解了
写了一发离线+BIT交上去发现比暴力多跑了一个点(?)
分析了一下复杂度好像是 O(Tn)O(Tn)
被reflash婊了一通
悲伤过后重新来搞,在reflash的提(jiao)示(yu)下化成了下面这样
P=kdP=kd
=\sum^n_{d=1}[\sigma(d)≤a]\sigma(d)\sum^n_{P=1}[d|P]\mu(\frac P d)\lfloor \frac n P\rfloor\lfloor \frac m P\rfloor
=\sum^n_{P=1}\lfloor \frac n P\rfloor\lfloor \frac m P\rfloor\sum^P_{d=1}[d|P][\sigma(d)≤a]\sigma(d)\mu(\frac P d)
设 F(n)=∑ni=1[i|n][σ(i)≤a]σ(i)μ(ni)F(n)=\sum^n_{i=1}[i|n][\sigma(i)≤a]\sigma(i)\mu(\frac n i)
=\sum^n_{P=1}\lfloor \frac n P\rfloor\lfloor \frac m P\rfloor F(P)
用BIT维护 FF的前缀和,然后处理每个询问的时候O(n√)O(\sqrt n)前缀和搞就可以了
一开始把所有的 σ(i)μ(ni)\sigma(i)\mu(\frac n i)保存下来,大约有 10610^6个,按照 σ(i)\sigma(i)排序
在BZ上跑了10s……rank倒数第5
又被reflash婊了一通
悲伤过后重新来搞,在reflash的提(jiao)示(yu)下开始现求 μ\mu里的东西(就是枚举d的倍数……)
然后跑了7s……
其实还可以线筛 σ\sigma,因为这是个积性函数(要记录最小质因子的若干次方)
改完以后终于跑到了4s左右……
不过还是很慢
复杂度 O(nlog2n+Tn√logn)O(n\log^2n+T\sqrt n\log n)
写一下这篇博客,记住自己菜到家的数论知识,顺便%%%reflash
#include<cstdio>
#include<iostream>
#include<algorithm>
#define LL long long
#define mo 2147483647
#define N 100000
using namespace std;
int cnt,prime[N+5],mu[N+5],t[N+5];
LL d[N+5],ans[N+5];
typedef pair<int,int>xy;
xy sigma[N+5];
bool vis[N+5];
struct node{int id,n,m,A;bool operator <(const node other)const{return A<other.A;}
}q[20005];
void add(int x,int val)
{for (;x<=N;x+=x&-x) d[x]+=val;
}
LL get(int x)
{LL t=0;for (;x;x-=x&-x) t+=d[x];return t;
}
main()
{mu[1]=1;sigma[1]=make_pair(1,1);t[1]=1;for (int i=2;i<=N;++i){if (!vis[i])prime[++prime[0]]=i,t[i]=i,sigma[i]=make_pair(i+1,i),mu[i]=-1;for (int j=1;j<=prime[0];++j){if (prime[j]*i>N) break;vis[prime[j]*i]=1;if (i%prime[j])t[i*prime[j]]=prime[j],sigma[i*prime[j]]=make_pair(sigma[prime[j]].first*sigma[i].first,i*prime[j]),mu[i*prime[j]]=-mu[i];else{t[i*prime[j]]=t[i]*prime[j];sigma[i*prime[j]]=make_pair(sigma[i].first+sigma[i/t[i]].first*t[i]*prime[j],i*prime[j]);mu[i*prime[j]]=0;break;}}}sort(sigma+1,sigma+N+1);int T;scanf("%d",&T);for (int i=1;i<=T;++i){scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].A);if (q[i].n>q[i].m) swap(q[i].n,q[i].m);q[i].id=i;}sort(q+1,q+T+1);int n,m,last=1;for (int i=1;i<=T;++i){n=q[i].n;m=q[i].m;for (;last<=N;++last)if (sigma[last].first<=q[i].A){int fi=sigma[last].first,se=sigma[last].second;for (int j=1;se*j<=N;++j)add(j*se,fi*mu[j]);}elsebreak;for (int last,j=1;j<=n;j=last+1)last=min(n/(n/j),m/(m/j)),ans[q[i].id]+=1LL*(n/j)*(m/j)*(get(last)-get(j-1));}for (int i=1;i<=T;++i) printf("%d\n",ans[i]&mo);
}
【BZOJ3529】数表,莫比乌斯反演+BIT相关推荐
- BZOJ3529: [Sdoi2014]数表(莫比乌斯反演,离线)
Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...
- BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)
题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...
- (每日一题)P3312 [SDOI2014]数表(经典莫比乌斯反演 + 树状数组维护离线询问)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.11 莫反 P3312 [SDOI2 ...
- 初涉莫比乌斯反演(附带例题)
什么是莫比乌斯反演 关于莫比乌斯反演 莫比乌斯反演,又称懵逼钨丝繁衍,是一种看了就一脸懵逼的东西. 好吧好吧,严肃点.(不过因为本蒟蒻真的很懵逼,所以错误之处请大神指出) 莫比乌斯反演就是下面这个式子 ...
- 莫比乌斯反演--懵逼反演系列
反演的定义 设有数论函数f(n),g(n)f(n),g(n)f(n),g(n),其中g(n)g(n)g(n)已知 且f(n),g(n)f(n),g(n)f(n),g(n)满足关系g(n)=∑i=0na ...
- 莫比乌斯函数+莫比乌斯反演
几个经典的莫比乌斯反演练习题 先来一个莫比乌斯函数板子 1 int N = 10000000; 2 int not_prim[10000050],prim[10000050]; 3 long long ...
- 良心发现,时隔一年再回首莫比乌斯反演(公式性质证明+题目练习)
文章目录 莫比乌斯反演 引入 公式 性质 模板 公式证明 莫比乌斯函数前缀和 题目练习 完全平方数 [HAOI2011]Problemb YY的GCD [SDOI2014]数表 [国家集训队]Cras ...
- 莫比乌斯反演学习笔记
背景: 之前不会用MarkdownMarkdownMarkdown,所以坑没有补. 定义: 以下除法默认向下去整. 对于一个形如Fn=∑d∣nfdF_n=\sum_{d|n}f_dFn=∑d∣nf ...
- matlab狄利克雷函数,数论入门1——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛...
数论入门1 一个菜鸡对数论的一点点理解... 莫比乌斯函数 定义函数$\mu(n)$为: 当n有平方因子时,$\mu(n)=0$. 当n没有平方因子时,$\mu(n)=(-1)^{\omega(n)} ...
最新文章
- Redis NoSQL
- 海思移植opencv+车辆检测
- 基于visual Studio2013解决面试题之1007鸡蛋和篮子
- 水电缴费系统php源码_简易水电费管理系统源程序代码
- 面对世界竞争对手,如何拿到Google PDF开源项目PDFium?
- micropython esp32手册_使用ESP32控制板(二):燒錄MicroPython韌體
- 算法高级(13)-常见负载均衡算法Java代码实现
- 底层I/O性能大PK:Python/Java被碾压,Rust有望取代C++
- 平衡二叉树平衡因子怎么计算_110. 平衡二叉树
- 使用Poedit汉化wordpress主题
- PlaySound的同步播放与异步播放
- python画图-python绘图入门(完整版)
- php 微信自动全屏视频设置,微信H5视频自动弹出全屏播放的解决方案
- 其它——简历编写、五险一金、补充一些就业相关的东西
- excel筛选排序从小到大_EXCEL表格数据从小到大-Excel如何从小到大排列顺序
- 思科模拟器的远程连接交换机的实现
- 鸿蒙电脑系统连不上打印机,电脑与打印机脱机怎么连接
- selenium新浪邮箱注册句柄切换实战
- 在迷茫时阅读。。。工作感悟
- Simcenter Flotherm XT案例练习
热门文章
- Android 扫描SD卡中的所有视频文件
- Service之bindService
- 下载的模型的位置(例如resnet18.pth)
- 目标检测算法之FPN(附FPN代码实现)
- Ubuntu 18.04 安装中文输入法
- python3 try except or_Python基础10:try except异常处理详解
- MySQL模糊查询的那些谣言
- Spark Streaming和Flume集成指南V1.4.1
- HTML标签的书写和嵌套规范
- matlab 计算数据转折点,计算轨迹(路径)中的转折点/枢轴点