[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(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]数表_树状数组_莫比乌斯反演的更多相关文章
- 【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)\)最多有 ...
- [bzoj3192][JLOI2013]删除物品_树状数组_栈
删除物品 bzoj-3192 JLOI-2013 题目大意:给你n个物品,分成2堆.所有的物品有不同的优先级.我只可以将一堆中的堆顶移动到另一个堆的堆顶.而如果当前物品是全局所有物品中优先级最高的,我 ...
- [POI2011]MET-Meteors 整体二分_树状数组_卡常
线段树肯定会 TLE 的,必须要用树状数组. Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorith ...
- [Cometoj#4 E]公共子序列_贪心_树状数组_动态规划
公共子序列 题目链接:https://cometoj.com/contest/39/problem/E?problem_id=1585 数据范围:略. 题解: 首先可以考虑知道了$1$的个数和$3$的 ...
- nyoj123_士兵杀敌(四)_树状数组_插线求点
士兵杀敌(四) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战 ...
- BZOJ_5055_膜法师_树状数组+离散化
BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...
- BZOJ_3653_谈笑风生_树状数组
BZOJ_3653_谈笑风生_树状数组 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”. ...
- BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树
BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...
- BZOJ_2141_排队_树状数组+分块
BZOJ2141_排队_树状数组+分块 Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了 ...
随机推荐
- P3291 [SCOI2016]妖怪
传送门 我数学的确白学了--这种题目竟然一点思路都没有-- 首先可以把每个妖怪看成二维平面上的一个点,那么每一个环境\((a,b)\)就可以看成一条斜率\(k=-\frac{b}{a}\)的过该点的直 ...
- [Swift通天遁地]九、拔剑吧-(9)创建支持缩放、移动、裁切的相机视图控制器
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Java经典算法之冒泡排序(Bubble Sort)
原理:比较相邻的两个值,将值大的元素交换至右端 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数 ...
- Linux 下 Solr的搭建与使用(建议jdk1.8以上)
官方表示solr5之后的版本不再提供对第三方容器的支持(不提供war包了). “旧式”solr.xml格式不再支持,核心必须使用core.properties文件定义. 使用第三方容器的需要自己手动修 ...
- PHP电影小爬虫(2)
学习了别人的爬虫后自己改的一个,算是又回顾了一下php的使用 我们来利用simple_html_dom的采集数据实例,这是一个PHP的库,上手很容易.simple_html_dom 可以很好的帮助我们 ...
- python常见的加密方式
1.前言 我们所说的加密方式都是对二进制编码的格式进行加密,对应到python中,则是我妈们的bytes. 所以当我们在Python中进行加密操作的时候,要确保我们的操作是bytes,否则就会报错. ...
- 使用Jupter Notebook实现简单的神经网络
参考:http://python.jobbole.com/82208/ 注:1)# %matplotlib inline 注解可以使Jupyter中显示图片 2)注意包的导入方式 一.使用的Pytho ...
- html5——3D案例(立体汉字,旋转导航)
1.立体汉字:旋转点left,attr(data-cont)可获取自定义属性值,skewY(倾斜转换)参考地址 2.旋转导航:先移动后旋转,li标签需要延迟执行旋转 注意::hover事件触发自己的: ...
- 使用码云gitee.com托管代码
1.新建项目 可以看到团队资源管理器是这样的,已经在本地有存储库,所有更改可以保存本地 2.在码云上新建项目 项目名称必填,其它项根据情况填写 3.复制项目地址关联到本地存储库 填写码云的项目地址,发 ...
- Windows Phone 8: NavigationInTransition实现页面切换效果
NavigationInTransition这个是实现页面切换效果,而且没控件来拖,要自己手动写, 将App.xaml.cs中InitializePhoneApplication()函数里的RootF ...