数表 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(i,j))$

$=\sum\limits_{i=1}^n\sum\limits_{j=1}^m f(d)\cdot [gcd(i,j)==d]$

$=\sum\limits_{d=1}^n f(d)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}[gcd(i,j)==1]$

$=\sum\limits_{d=1}^n f(d)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}\sum\limits_{e|i,e|j} \mu(e)$

$=\sum\limits_{d=1}^n f(d)\sum\limits_{e=1}^{\lfloor\frac{n}{d}\rfloor}\mu(e)\sum\limits_{i=1}^{\lfloor\frac{n}{de}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{de}\rfloor}$

$=\sum\limits_{D=1}^n \sum\limits_{d|D} f(d)\cdot \mu(\frac{D}{d})sum(\lfloor\frac{n}{D}\rfloor)sum(\lfloor\frac{m}{D}\rfloor)$

然后,显然$f$函数是积性函数,$\mu$函数是积性函数,所以$f$和$\mu$的狄利克雷卷积$f\cdot \mu$是积性函数,所以不限制的问题就解决了。

那我们考虑限制怎么办?其实也非常简单。我们只需要在树状数组上维护出小于a的f,查询即可。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 2147483647
using namespace std;
typedef long long ll;
const int N=100010;
int mu[N],e[N],ans[N],c[N],vis[N],p[N],t[N],g[N];
struct F{int d,num;}f[N];
struct Q{int n,m,a,id;}q[N];
inline bool cmpT(Q a,Q b){return a.a<b.a;}
inline bool cmpt(F a,F b){return a.d<b.d;}
inline int lowbit(int x){return x&-x;}
int power(int a,int b)
{
int res=1;
while(b)
{
if (b&1) res*=a;
a*=a;
b>>=1;
}
return res;
}
void add(int x,int val)
{
for(int i=x;i<N;i+=lowbit(i)) c[i]+=val;
}
int query(int x)
{
int s=0;
for(int i=x;i;i-=lowbit(i)) s+=c[i];
return s;
}
int main()
{
mu[1]=1;f[1].d=f[1].num=1;
for(int i=2;i<N;i++)
{
f[i].num=i;
if(!vis[i]) mu[i]=-1,f[i].d=t[i]=1+i,g[i]=1,p[++p[0]]=i;
for(int j=1;j<=p[0] && i*p[j]<N;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0)
{
mu[i*p[j]]=0;
g[i*p[j]]=g[i]+1;
t[i*p[j]]=t[i]+power(p[j],g[i]+1);
f[i*p[j]].d=f[i].d/t[i]*t[i*p[j]];
break;
}
else
{
mu[i*p[j]]=-mu[i];
f[i*p[j]].d=f[i].d*f[p[j]].d;
g[i*p[j]]=1;t[i*p[j]]=p[j]+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),q[i].id=i;
sort(q+1,q+1+T,cmpT);
sort(f+1,f+N,cmpt);
for(int now=0,i=1;i<=T;i++)
{
while(now+1<N && f[now+1].d<=q[i].a)
{
now++;
for(int j=1;j*f[now].num<N;j++)
{
add(j*f[now].num,mu[j]*f[now].d);
}
}
int n=q[i].n,m=q[i].m;
if(n>m) swap(n,m);
for(int j=1,k;j<=n;j=k+1)
{
k=min(n/(n/j),m/(m/j));
ans[q[i].id]+=(n/j)*(m/j)*(query(k)-query(j-1));
}
ans[q[i].id]&=inf;
}
for(int i=1;i<=T;i++) printf("%d\n",ans[i]);
return 0;
}

小结:这就是典型的拟对象的题,我们通过先构造拟对象,然后向完全对象转化,非常巧妙。

[bzoj3529][Sdoi2014]数表_树状数组_莫比乌斯反演的更多相关文章

  1. 【JZOJ3623】【SDOI2014】数表(table) 树状数组+离线+莫比乌斯反演

    题面 100 \[ Ans=\sum_{i=1}^n\sum_{j=1}^mg(gcd(i,j)) \] 其中, \[ g(d)=\sum_{i|d}i \] 我们注意到\(gcd(i,j)\)最多有 ...

  2. [bzoj3192][JLOI2013]删除物品_树状数组_栈

    删除物品 bzoj-3192 JLOI-2013 题目大意:给你n个物品,分成2堆.所有的物品有不同的优先级.我只可以将一堆中的堆顶移动到另一个堆的堆顶.而如果当前物品是全局所有物品中优先级最高的,我 ...

  3. [POI2011]MET-Meteors 整体二分_树状数组_卡常

    线段树肯定会 TLE 的,必须要用树状数组. Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorith ...

  4. [Cometoj#4 E]公共子序列_贪心_树状数组_动态规划

    公共子序列 题目链接:https://cometoj.com/contest/39/problem/E?problem_id=1585 数据范围:略. 题解: 首先可以考虑知道了$1$的个数和$3$的 ...

  5. nyoj123_士兵杀敌(四)_树状数组_插线求点

    士兵杀敌(四) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战 ...

  6. BZOJ_5055_膜法师_树状数组+离散化

    BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...

  7. BZOJ_3653_谈笑风生_树状数组

    BZOJ_3653_谈笑风生_树状数组 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”. ...

  8. BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树

    BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

  9. BZOJ_2141_排队_树状数组+分块

    BZOJ2141_排队_树状数组+分块 Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了 ...

随机推荐

  1. 【RAID在数据库存储上的应用 】

    随着单块磁盘在数据安全.性能.容量上呈现出的局限,磁盘阵列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出现了,RAID把多块独立的磁 ...

  2. [Apple开发者帐户帮助]六、配置应用服务(5.3)推送通知(APN):从您的Web服务器发送推送通知

    要使用APN从Web服务器向macOS用户发送推送通知,请注册网站推送标识符并创建网站推送证书. 对于每个网站,请注册一个网站推送标识符,用于验证通知是否来自您的服务器.然后创建一个网站推送证书以签署 ...

  3. Java线程之Synchronized用法

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对 ...

  4. Visual Studio Code配置GitHub(Win7环境)

    一.软件环境说明(演示环境) 1.操作系统:Windows7旗舰版(64bit) 2.Visual Studio Code版本:1.32.3 3.Git版本:2.21.0.windows.1 二.软件 ...

  5. PHPExcel读取文件日期处理,含时分秒(Thinkphp)

    我们使用PHPExcel读取excel文件后发现,时间都是类似于这样的数字:41890.620138889,那么如何将它处理成我们想要的2014-09-08 14:53:00这样格式的日期呢,看代码: ...

  6. linux tmux基本操作

    1. 安装工具 Centos : yum install tmux 2. 基本操作 新建会话:tmux new -s session-name 查看会话:tmux ls 进入会话:tmux a -t ...

  7. Elasticsearch之sense插件的安装(图文详解)

    sense插件可以方便的执行rest请求,但是中文输入的体验不是很好. 安装sense只需要在Kibana端安装插件即可,插件会自动安装到kibana的应用菜单中. [hadoop@master ki ...

  8. 10.Nodes and Bindings

    节点数据绑定 节点是构成Ventuz场景的基本元素.每个节点既属于图层.也属于层级或内容.既可以在图层编辑器,也可以在层级编辑器或内容编辑器中编辑. 内容节点包括资产描述(如材质.xml文件等).数字 ...

  9. JVM中线程状态转换图

    JVM中线程的状态转换图 线程在一定条件下,状态会发生变化.线程一共有以下几种状态: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该 ...

  10. jsp之认识 servlet (基础、工作原理、容器请求处理)

    Tomcat 的安装: eclipse 需要自行安装tomcat,这是web 项目运行的服务器.如果用的是MyEclipse,里面自带tomcat,方便清除部署垃圾,利于项目运行. Tomcat的安装 ...