【BZOJ3529】[SDOI2014] 数表(莫比乌斯反演)

点此看题面

大致题意: 规定一个\(n*m\)数表中每个数为\(\sum_{d|i,d|j}d\),求数表中不大于\(a\)的数之和。

不考虑限制

我们先不考虑限制,来推一波式子。

首先,易知数表中第\(i\)行第\(j\)列的数应该是\(\sigma(gcd(i,j))\)。

则和就为:

\[\sum_{d=1}^{min(n,m)}\sigma(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac md\rfloor}[gcd(i,j)=1]\]

而\([gcd(i,j)=1]\)可以化成\(\sum_{p|gcd(i,j)}\mu(p)\),若枚举\(p\),就得到:

\[\sum_{d=1}^{min(n,m)}\sigma(d)\sum_{p=1}^{\lfloor\frac{min(n,m)}d\rfloor}\mu(p)\lfloor\frac n{dp}\rfloor\lfloor\frac m{dp}\rfloor\]

设\(g=dp\),调整枚举顺序得到:

\[\sum_{g=1}^{min(n,m)}\lfloor\frac n{dp}\rfloor\lfloor\frac m{dp}\rfloor\sum_{d|g}\sigma(d)\mu(\frac gd)\]

离线处理限制

考虑上面的式子只有当\(\sigma(d)\le a\)时才会被计算答案。

则我们考虑设\(T(g)=\sum_{d|g}\sigma(d)\mu(\frac gd)\),一开始全为\(0\)。

然后我们按照\(a\)从小到大枚举询问,每次将\(\sigma(d)\le a\)的\(d\)在\(10^5\)范围内的倍数所对应的\(T(g)\)全都加上\(\sigma(d)\mu(\frac gd)\)。

但注意到询问时使用除法分块需要求一段区间的\(T\)值和,则我们用树状数组维护就可以了。

关于取模的细节

注意,这里的取模是向\(2^{31}\)取模,则我们可以考虑先开\(unsigned\ int\)计算答案,最后再将其向\(2^{31}\)取模

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define Q 20000
#define MxS 500000
#define UI unsigned
#define RU Reg unsigned
#define CU Con unsigned&
#define LL long long
#define Gmax(x,y) (x<(y)&&(x=(y)))
#define min(x,y) ((x)<(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y))
#define pb push_back
#define IT vector<int>::iterator
using namespace std;
int Qt,Qans[Q+5];vector<int> s[MxS+5];
struct Query//询问
{
    int x,y,v,pos;I Query(CI a=0,CI b=0,CI z=0,CI p=0):x(a),y(b),v(z),pos(p){}
    I bool operator < (Con Query& o) Con {return v<o.v;}
}q[Q+5];
class FastIO
{
    private:
        #define FS 100000
        #define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
        #define pc(c) (C==E&&(clear(),0),*C++=c)
        #define tn (x<<3)+(x<<1)
        #define D isdigit(c=tc())
        int T;char c,*A,*B,*C,*E,FI[FS],FO[FS],S[FS];
    public:
        I FastIO() {A=B=FI,C=FO,E=FO+FS;}
        Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
        Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
        Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
        Tp I void writeln(Con Ty& x) {write(x),pc('\n');}
        I void clear() {fwrite(FO,1,C-FO,stdout),C=FO;}
}F;
class LinearSiever//线性筛
{
    private:
        int Pt,P[N+5],Mn[N+5];
        I LL Qpow(LL x,LL y) {LL t=1;W(y) y&1&&(t*=x),x*=x,y>>=1;return t;}//快速幂
    public:
        int MxSigma,sigma[N+5],mu[N+5];
        I void Sieve(CI S)
        {
            RI i,j,x,t;for(mu[1]=1,i=2;i<=S;++i)//筛mu,筛最小质因数用于求sigma
            {
                !Mn[i]&&(mu[P[++Pt]=i]=-1,Mn[i]=i);
                for(j=1;j<=Pt&&1LL*i*P[j]<=S;++j)
                    if(Mn[i*P[j]]=P[j],i%P[j]) mu[i*P[j]]=-mu[i];else break;
            }
            for(sigma[1]=1,i=2;i<=S;++i)//求sigma
            {
                x=i,t=0;W(!(x%Mn[i])) x/=Mn[i],++t;
                sigma[i]=sigma[x]*((Qpow(Mn[i],t+1)-1)/(Mn[i]-1)),Gmax(MxSigma,sigma[i]);
            }
        }
}L;
class TreeArray//树状数组
{
    private:
        #define lowbit(x) (x&-x)
        UI v[MxS+5];
        I UI QS(RI x) {RU t=0;W(x) t+=v[x],x-=lowbit(x);return t;}//询问前缀
    public:
        I void Add(RI x,CI y) {W(x<=L.MxSigma) v[x]+=y,x+=lowbit(x);}//单点修改
        I UI Qry(CI l,CI r) {return QS(r)-QS(l-1);}//区间查询
}T;
I void Upt(CI x,CI v) {for(RI i=1;1LL*x*i<=N;++i) T.Add(x*i,L.sigma[x]*L.mu[i]);}//更新一个数倍数的值
int main()
{
    RI i,p=1,t,x,y,v,l,r;UI ans;for(L.Sieve(N),i=1;i<=N;++i) s[L.sigma[i]].pb(i);//用桶对sigma值进行排序
    for(F.read(Qt),i=1;i<=Qt;++i) F.read(x,y,v),q[i]=Query(min(x,y),max(x,y),v,i);//读入询问
    for(sort(q+1,q+Qt+1),i=1;i<=Qt;++i)//对询问按a从小到大排序
    {
        W(p<=q[i].v) {for(IT it=s[p].begin();it!=s[p].end();++it) Upt(*it,p);++p;}//更新sigma(d)≤a的d的倍数的T值
        for(ans=0,t=min(q[i].x,q[i].y),l=1;l<=t;l=r+1)//除法分块
            r=min(q[i].x/(q[i].x/l),q[i].y/(q[i].y/l)),ans+=T.Qry(l,r)*(q[i].x/l)*(q[i].y/l);
        Qans[q[i].pos]=ans%(1LL<<31);//存储答案并取模
    }
    for(i=1;i<=Qt;++i) F.writeln(Qans[i]);return F.clear(),0;//输出答案
}

转载于:https://www.cnblogs.com/chenxiaoran666/p/BZOJ3529.html

Excel转LaTeX表格神器:excel2latex.xla插件使用全攻略(含下载链接与配置教程) 本文详细介绍了Excel转LaTeX表格神器excel2latex.xla插件的完整使用攻略。从下载安装、基础转换到高级配置,深入讲解了如何利用该插件高效生成LaTeX代码,特别针对IEEE双栏等复杂排版需求提供了专业解决方案,帮助用户彻底告别手动编码,提升学术与专业文档的排版效率。 阅读详情

相关推荐

Windows 64 位系统下安装配置 DOSBox 及 debug.exe

该篇博客同样作为类似问题 “如何在 Windows 64 位系统下进入 debug” 的答案。 很多同学初看王爽的《汇编语言》,或者因为其它原因需要进入 debug 调试模式下学习汇编语言的时候,会发现进入不了,出现类似以下的错误提示。 这是因为他们使用的是 64 位的 Windows 系统(Win 7,Win 8 以及 Win 10 等),而 64 位 Windows 系统不再支持在命令提示符窗口下进入 debug 调试模式。那么对于使用 64 位 Windows 系统的用户来说,该怎样才能够顺利进入 d

加号减减号的博客 5万+

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

【BZOJ3529】[Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和。给定a,计算数表中不大于a的数之和。 Input 输入包含多组数据。 输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,...

aodanchui1057的博客 165

腾讯云DBA面试(一面)

在第二阶段,根据RM返回的结果,如果涉及分布式事务的所有RM都返回可以提交, 则TM给RM发送commit的命令,每个RM实现自己的提交,同时释放锁和资源,然后RM反馈提交成功, TM完成整个分布式事务;根据事务所处的阶段,可以回滚到具体的版本,实现一致性。1.并发执行的事务,在prepare阶段,redo log先写文件缓存,第一个领头的事务,在等待n个事务后, 在第一个事务去刷写磁盘时,会把同组的其他的事务,也一起刷写到磁盘上,这样就减少了刷盘的次数,降低了磁盘的IOPS。分布式锁是怎么实现的?

u012565458的博客 1977

BZOJ3529: [Sdoi2014]数表 莫比乌斯反演_树状数组

BZOJ3529: [Sdoi2014]数表 莫比乌斯反演_树状数组 Code: #include &lt;cstdio&gt; #include &lt;algorithm&gt; #include &lt;cstring&gt; #define ll long long #define setIO(s) freopen(s"...

EM LGH 178

新手必看:5分钟搞定Unitree Go1机器狗Gazebo仿真运动控制(附按键图解)

本文为新手提供了Unitree Go1机器狗在Gazebo仿真环境中实现运动控制的快速指南。通过5分钟极简配置和按键图解,帮助开发者快速掌握宇树科技明星产品的基础操作,包括环境搭建、仿真启动和运动控制技巧,适合零基础用户快速上手。

weixin_42550597的博客 300

Vector CANoe VT2516A实战:从硬件连接到CAPL脚本的完整配置指南

本文详细介绍了Vector CANoe VT2516A板卡从硬件连接到CAPL脚本编写的完整配置指南。涵盖硬件接线原则、VT System配置避坑技巧、系统变量创建规范、可视化Panel设计、CAPL脚本调试及典型故障排查案例,帮助工程师快速掌握VT2516A板卡的应用实践,提升汽车电子测试效率。

weixin_30608503的博客 254

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

bzoj3529: [Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和。给定a,计算数表中不大于a的数之和。 Input 输入包含多组数据。 输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一

maxtir的博客 327

路径规划:D*Lite寻路算法详解

D*Lite详解目录

mkr67n的博客 2万+

Bzoj 3529. [Sdoi2014]数表(莫比乌斯反演)

题目大意: 题目链接 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为能同时整除 i 和 j 的所有自然数之和。给定 a , 计算数表中不大于 a 的数之和。 多组询问 题目思路: 写题时看的是这篇博客:BZOJ 3529 SDOI2014 数表 莫比乌斯反演+树状数组 令F[i]F[i]F[i]为iii的约数和,num[i]num[i]num[i]为最大公约数为iii的个数 如果不看aaa的限制,其实这道题,计算的仅仅是an

trouble_的博客 156

Autosar软件组件分析及ARXML文件分析

Autosar软件组件分析及ARXML文件分析

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 3601

项目实战第四十七讲:易宝支付对接详解(保姆级教程)

本文是项目实战第四十七讲,易宝支付对接详解。1、xxl_job 接入fix;2、支付接口,将thirdOrderNo赋初始值,并将数据库中third_Order_No设置为非空;3、性能提效:将深拷贝改为字符赋值,提升程序性能;先不改动。

Jet_qi的博客 2680

[BZOJ3529][莫比乌斯反演][树状数组]SDOI2014:数表

BZOJ3529 要求的是约数和 如果没有a的限制,直接反演就完了 有a的限制的话,把询问按a排序,用树状数组维护约数和乘上μ\muμ的前缀和即可 Code: #include<bits/stdc++.h> #define mod 2147483648 #define ll long long using namespace std; inline int read(){ int r...

romiqi 226

【AI智能体】Spring AI Tool 从使用到实战详解

Spring AI Tool

congge 5865

BZOJ3529 SDOI2014 数表 莫比乌斯反演+树状数组

题意:T组询问,每组询问给出N,M,a,有一张N×m的数表,其第i行第j列(1≤i≤N,1≤j≤M)的数值为能同时整除i和j的所有自然数之和。给定a,计算数表中不大于a的数之和。 题解: 首先我们预处理出来所有数的约数和,也就是F函数,定义g(i)=1到N和1到M中gcd含有i这个因子的组数,这玩意等于啥我就不多提了,不知道的话建议去做一下2301。 接下来就全是套路了——枚举因数...

a18700013354的博客 197

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[BZOJ3529][Sdoi2014]数表 && 莫比乌斯反演+树状数组

因为这个好好地复习了一下莫比乌斯反演 结果才发现这是自己的第一篇莫比乌斯反演 具体内容太长了 写了两页草稿纸 想看就去orz一下PoPoQQQ大爷吧 传送门http://blog.youkuaiyun.com/popoqqq/article/details/42076231 #include #include #include #include #include #define SF scanf #de

shiyukun1998的专栏 619

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[BZOJ3529] [SDOI2014] 数表 - 莫比乌斯反演 - 树状数组

具体怎么反演的请看POPOQQQ大爷的莫比乌斯反演论文TATATAT 然后注意,当用到函数F(i)的时候再将函数筛入树状数组里。。 时间复杂度O(n log^2 n+q√n log n) 如果不自然溢出会慢很多TAT #include "stdio.h" #include "iostream" #include "algorithm" #include "stdlib.h" #includ

whzzt的博客 400

【BZOJ3529】【SDOI2014】—数表(莫比乌斯反演+树状数组)

传送门 题意: 令F(x)F(x)F(x)表示所有xxx的约数之和 求∑i=1n∑j=1m[F(gcd(i,j))≤a]F(gcd(i,j))%231\sum_{i=1}^{n}\sum_{j=1}^{m}[F(gcd(i,j))\le a]F(gcd(i,j))\%2^{31}i=1∑n​j=1∑m​[F(gcd(i,j))≤a]F(gcd(i,j))%231 Solution:Soluti...

Stargazer的博客 242

[bzoj3529][Sdoi2014]数表_树状数组_莫比乌斯反演

数表 bzoj-3529 Sdoi-2014 题目大意:n*m的数表,第i行第j列的数是同时整除i和j的所有自然数之和。给定a,求数表中所有不超过a的和。 注释:$1\le n,m \le 10^5$。 想法:我们先不考虑那个a的限制:我们设f(i)表示整除i的自然数之和。 $\sum\limits_{i=1}^n\sum\limits_{j=1}^m f(gcd(...

dianan0938的博客 94

BZOJ3529 [Sdoi2014]数表 【莫比乌斯反演】

3529: [Sdoi2014]数表Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2151 Solved: 1080 [Submit][Status][Discuss] Description有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和。给定a,计算数表中不大

Mychael的无声乐章 278

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

Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和。给定a,计算数表中不大于a的数之和。 Input 输入包含多组数据。 输入的第一行一个整数Q表示测试点内...

Gregory99174的博客 203

BZOJ3529 || 洛谷P3312 [SDOI2014]数表【莫比乌斯反演+树状数组】

g(k)=∑i=1n∑j=1m[gcd(i,j)=k]=∑k∣dμ(dk)⌊nd⌋⌊md⌋=∑t=1min(⌊nk⌋,⌊mk⌋)μ(t)⌊ntk⌋⌊mtk⌋g(k)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=k]=\sum_{k|d}\mu(\frac{d}{k})\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor=\su...

niiick 201

BZOJ 3529 [Sdoi2014]数表 【莫比乌斯反演】

Description 有一张N×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和。给定a,计算数表中不大于a的数之和。 HINT 1 < =N.m < =10^5, 1 < =Q < =2×10^4 Solution 先假设a的限制不存在 正面把答案强...

weixin_30343157的博客 115

bzoj 3529 [Sdoi2014]数表 莫比乌斯反演+树状数组+离线处理

题面 题目传送门 解法 显然,对于每一个格子(i,j)(i,j)(i,j),在不管限制的情况下它对答案的贡献为σ(gcd(i,j))\sigma(gcd(i,j))σ(gcd(i,j))(σ(i)\sigma(i)σ(i)表示iii的约数和)。 那么我们不妨考虑每一个d=gcd(i,j)d=gcd(i,j)d=gcd(i,j)对整个答案的贡献,应该是σ(d)∑i=1n∑j=1m[gcd(i,j)...

mysterynoip的博客 595

bzoj 3529: [Sdoi2014]数表 莫比乌斯反演&树状数组

然后按照f[i]和a分别排序之后离线插入用树状数组维护前缀和即可。 AC代码如下: #include #include #include #define N 100005 using namespace std; int cnt,pt,mx,p[N],mu[N],c[N],prm[N],ans[N]; struct node{ int x,y,k,id; }a[N],f[N]; int re

lych的博客 688
上一篇: [BZOJ3236]:[Ahoi2013]作业(莫队+分块)
下一篇: HDU 2899 - Strange fuction (三分)
badiu_30394251
博客等级 码龄11年 124粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值