点此看题面

大致题意: 规定一个\(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}\)取模

代码

  1. #include<bits/stdc++.h>
  2. #define Tp template<typename Ty>
  3. #define Ts template<typename Ty,typename... Ar>
  4. #define Reg register
  5. #define RI Reg int
  6. #define Con const
  7. #define CI Con int&
  8. #define I inline
  9. #define W while
  10. #define N 100000
  11. #define Q 20000
  12. #define MxS 500000
  13. #define UI unsigned
  14. #define RU Reg unsigned
  15. #define CU Con unsigned&
  16. #define LL long long
  17. #define Gmax(x,y) (x<(y)&&(x=(y)))
  18. #define min(x,y) ((x)<(y)?(x):(y))
  19. #define max(x,y) ((x)>(y)?(x):(y))
  20. #define pb push_back
  21. #define IT vector<int>::iterator
  22. using namespace std;
  23. int Qt,Qans[Q+5];vector<int> s[MxS+5];
  24. struct Query//询问
  25. {
  26. 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){}
  27. I bool operator < (Con Query& o) Con {return v<o.v;}
  28. }q[Q+5];
  29. class FastIO
  30. {
  31. private:
  32. #define FS 100000
  33. #define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
  34. #define pc(c) (C==E&&(clear(),0),*C++=c)
  35. #define tn (x<<3)+(x<<1)
  36. #define D isdigit(c=tc())
  37. int T;char c,*A,*B,*C,*E,FI[FS],FO[FS],S[FS];
  38. public:
  39. I FastIO() {A=B=FI,C=FO,E=FO+FS;}
  40. Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
  41. Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
  42. Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
  43. Tp I void writeln(Con Ty& x) {write(x),pc('\n');}
  44. I void clear() {fwrite(FO,1,C-FO,stdout),C=FO;}
  45. }F;
  46. class LinearSiever//线性筛
  47. {
  48. private:
  49. int Pt,P[N+5],Mn[N+5];
  50. I LL Qpow(LL x,LL y) {LL t=1;W(y) y&1&&(t*=x),x*=x,y>>=1;return t;}//快速幂
  51. public:
  52. int MxSigma,sigma[N+5],mu[N+5];
  53. I void Sieve(CI S)
  54. {
  55. RI i,j,x,t;for(mu[1]=1,i=2;i<=S;++i)//筛mu,筛最小质因数用于求sigma
  56. {
  57. !Mn[i]&&(mu[P[++Pt]=i]=-1,Mn[i]=i);
  58. for(j=1;j<=Pt&&1LL*i*P[j]<=S;++j)
  59. if(Mn[i*P[j]]=P[j],i%P[j]) mu[i*P[j]]=-mu[i];else break;
  60. }
  61. for(sigma[1]=1,i=2;i<=S;++i)//求sigma
  62. {
  63. x=i,t=0;W(!(x%Mn[i])) x/=Mn[i],++t;
  64. sigma[i]=sigma[x]*((Qpow(Mn[i],t+1)-1)/(Mn[i]-1)),Gmax(MxSigma,sigma[i]);
  65. }
  66. }
  67. }L;
  68. class TreeArray//树状数组
  69. {
  70. private:
  71. #define lowbit(x) (x&-x)
  72. UI v[MxS+5];
  73. I UI QS(RI x) {RU t=0;W(x) t+=v[x],x-=lowbit(x);return t;}//询问前缀
  74. public:
  75. I void Add(RI x,CI y) {W(x<=L.MxSigma) v[x]+=y,x+=lowbit(x);}//单点修改
  76. I UI Qry(CI l,CI r) {return QS(r)-QS(l-1);}//区间查询
  77. }T;
  78. 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]);}//更新一个数倍数的值
  79. int main()
  80. {
  81. 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值进行排序
  82. 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);//读入询问
  83. for(sort(q+1,q+Qt+1),i=1;i<=Qt;++i)//对询问按a从小到大排序
  84. {
  85. 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值
  86. for(ans=0,t=min(q[i].x,q[i].y),l=1;l<=t;l=r+1)//除法分块
  87. 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);
  88. Qans[q[i].pos]=ans%(1LL<<31);//存储答案并取模
  89. }
  90. for(i=1;i<=Qt;++i) F.writeln(Qans[i]);return F.clear(),0;//输出答案
  91. }

【BZOJ3529】[SDOI2014] 数表(莫比乌斯反演)的更多相关文章

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

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

  2. BZOJ3529: [Sdoi2014]数表(莫比乌斯反演,离线)

    Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...

  3. BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)

    题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...

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

    Code: #include <cstdio> #include <algorithm> #include <cstring> #define ll long lo ...

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

    bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[ ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. vue+elementui+netcore混合开发

    1.VueController.cs using Bogus; using System; using System.Collections.Generic; using System.Linq; u ...

  2. JVM的监控工具之jmap

    参考博客:https://www.jianshu.com/p/a4ad53179df3 jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件 ...

  3. 古老的txt下传和txt上载

    1.下传文件 TYPES:BEGIN OF TY_DATA, A2 TYPE CHAR20, B2 TYPE I, C2 TYPE CHAR20, END OF TY_DATA. DATA:IT_DA ...

  4. 一款常用的截图工具(能够截gif动图)

    这款工具用来截程序的演示GIF图片,灰常方便. 直接上Github地址: https://github.com/NickeManarin/ScreenToGif

  5. C# 学习笔记 多态(一)虚方法

    在面对对象编程中,类的三大特性分别为封装,继承,多态.其中多态的具体实现,依赖于三个方法,也就是虚方法,抽象类和接口. 多态的具体作用是什么呢?或者说多态的存在有什么意义呢?多态的存在有效的降低了程序 ...

  6. Java并发包——线程安全的Map相关类

    Java并发包——线程安全的Map相关类 摘要:本文主要学习了Java并发包下线程安全的Map相关的类. 部分内容来自以下博客: https://blog.csdn.net/bill_xiang_/a ...

  7. Linux性能调优 | 01 平均负载的理解和分析

    01 uptime命令 通常我们发现系统变慢时,我们都会执行top或者uptime命令,来查看当前系统的负载情况,比如像下面,我执行了uptime,系统返回的了结果. [root@lincoding ...

  8. 大白话说GIT常用操作,常用指令git操作大全

    列一下在开发中用的比较多的git指令 git clone https://github.com/chineseLiao/Small-career // 克隆远程仓库到本地 git add . // 把 ...

  9. anaconda配置清华大学开源软件镜像

    配置镜像在anaconda安装好之后,默认的镜像是官方的,由于官网的镜像在境外,使用国内的镜像能够加快访问的速度.这里选择了清华的的镜像.镜像的地址如下:tuna.Anaconda 安装包可以到 ht ...

  10. Win2003下安装PHP5.2.0+MySql5.0.27+PHPMyAdmin2.9.1的配置方法

    先下载所需要安装的东东~~ PHP 5.2.0 官方下载地址:http://www.php.net/downloads.php mysql-5.0.27 官方下载地址:http://dev.mysql ...