P3312 [SDOI2014]数表

题目描述

有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\(i\)和\(j\)的所有自然数之和。给定\(a\),计算数表中不大于\(a\)的数之和。

输入输出格式

输入格式:

输入包含多组数据。

输入的第一行一个整数\(Q\)表示测试点内的数据组数

接下来\(Q\)行,每行三个整数\(n\),\(m\),\(a\)(\(|a| \le 10^9\))描述一组数据。

输出格式:

对每组数据,输出一行一个整数,表示答案模\(2^{31}\)的值。

说明

\(1 \le N,M\le 10^5\) , \(1 \le Q \le 2*10^4\)


按道理就是先不管条件。

然后化简式子得到了

\[\sum_{k=1}^{\min(n,m)}k\lfloor\frac{n}{k}\rfloor\lfloor\frac{m}{k}\rfloor
\]

想想确实不能拿掉一些东西,否则没法做。

想到有\(\mathbf {Id}=\sigma*\mu\)

于是把式子拆开

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

或者换个方向反演也可以得到这个式子。

我们知道格子\((i,j)\)的值就是\(\sigma(gcd(i,j))\)

于是我们可以离线读入,然后从小到大把\(\sigma\)加入前缀和。

具体的,可以拿一个树状数组维护\(\sum_{d|k}\sigma(d)\mu(\frac{k}{d})\)的前缀和,然后每次查询或者加一些东西进去就可以了。

复杂度\(O(n\log^2n+Q\sqrt n\log n)\)


Code:

#include <cstdio>
#include <algorithm>
const int N=1e5;
std::pair <int,int> sigma[N+10];
int mu[N+10],v[N+10];
void init()
{
for(int i=1;i<=N;i++) mu[i]=1,sigma[i]=std::make_pair(i+1,i);
sigma[1].first=1;
for(int i=2;i<=N;i++)
{
if(!v[i]) mu[i]=-1;
for(int j=i*2;j<=N;j+=i)
{
sigma[j].first+=i;
if(!v[i])
{
if((j/i)%i==0) mu[j]=0;
else mu[j]*=-1;
v[j]=1;
}
}
}
std::sort(sigma+1,sigma+1+N);
}
int min(int x,int y){return x<y?x:y;}
struct node
{
int n,m,a,id;
bool friend operator <(node n1,node n2){return n1.a<n2.a;}
}qry[N+10];
int s[N+10],ans[N+10],pos=1,T;
void add(int p,int d){while(p<=N)s[p]+=d,p+=p&-p;}
int ask(int p){int sum=0;while(p)sum+=s[p],p-=p&-p;return sum;}
void change(int d)
{
while(sigma[pos].first<=d&&pos<=N)
{
for(int i=sigma[pos].second;i<=N;i+=sigma[pos].second)
add(i,sigma[pos].first*mu[i/sigma[pos].second]);
++pos;
}
}
int main()
{
init();
scanf("%d",&T);
for(int i=1;i<=T;i++)
scanf("%d%d%d",&qry[i].n,&qry[i].m,&qry[i].a),qry[i].id=i;
std::sort(qry+1,qry+1+T);
for(int i=1;i<=T;i++)
{
change(qry[i].a);
int n=qry[i].n,m=qry[i].m,sum=0;
for(int l=1,r;l<=min(n,m);l=r+1)
{
r=min(n/(n/l),m/(m/l));
sum+=(n/l)*(m/l)*(ask(r)-ask(l-1));
}
ans[qry[i].id]=sum&0x7fffffff;
}
for(int i=1;i<=T;i++) printf("%d\n",ans[i]);
return 0;
}

2018.11.26

洛谷 P3312 [SDOI2014]数表 解题报告的更多相关文章

  1. 洛谷P3312 - [SDOI2014]数表

    Portal Solution 共\(T(T\leq2\times10^4)\)组测试数据.给出\(n,m(n,m\leq10^5),a(a\leq10^9)\),求\[ \sum_{i=1}^n\s ...

  2. 洛谷 P3313 [SDOI2014]旅行 解题报告

    P3313 [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教 ...

  3. [bzoj3529] [洛谷P3312] [Sdoi2014] 数表

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

  4. 洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)

    传送门 不考虑$a$的影响 设$f(i)$为$i$的约数和 $$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$ $$=\sum\limi ...

  5. 洛谷 P3312 [SDOI2014]数表

    式子化出来是$\sum_{T=1}^m{\lfloor}\frac{n}{T}{\rfloor}{\lfloor}\frac{m}{T}{\rfloor}\sum_{k|T}\mu(\frac{T}{ ...

  6. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  7. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  8. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  9. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

随机推荐

  1. Linux TCP/IP调优参数 /proc/sys/net/目录

    所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数,后面是它们的含义: /proc/sys/net/core/rmem_default " ...

  2. HTTP简单教程

    目录 HTTP简介 HTTP工作原理 HTTP消息结构 客户端请求消息 服务器响应消息 实例 HTTP请求方法 HTTP响应头信息 HTTP状态码 HTTP状态码分类 HTTP状态码列表 HTTP c ...

  3. NES像素风格的Raspberry

    周末小实践,vue+树莓派+一言API 一直有个想法,让树莓派做后端,实现一个有趣的网络服务.可是,苦于不会前端,迟迟无法动手.最近由于工作任务需要研究了一下前端. 问过前端大佬们,个个都说你得用vu ...

  4. python-创建进程的三种方式

    目录 1,os.fork() 方法 2,Process方法 3,Pool方法 1,os.fork() 方法 import os ret = os.fork() if ret == 0: #子进程 pr ...

  5. OpenLDAP编译安装及配置

    原文发表于cu:2016-06-20 参考文档: 原理:http://seanlook.com/2015/01/15/openldap_introduction/ 官方文档: http://www.o ...

  6. html页面中完成查找功能

    最近在搞一个被很多人改了的框架,天天看代码看的头的晕了,不过感觉进步还挺大的,自己做了一个后台可配置前台查看两个库不同数据范围的东西,还挺满意,那天拿出来分享一下,今天先说一个这几天做的功能,就是ht ...

  7. 从零开始的Python学习Episode 8——深浅拷贝

    深浅拷贝 一.浅拷贝 列表中存储的是数据的内存地址,当我们要查询或修改列表中的数据时,我们是通过列表中的地址找到要访问的内存.当我们修改列表中的数据时,如果修改的是一个不可变类型(整型,长整型,浮点数 ...

  8. 《Cocos2d-x游戏开发实战精解》学习笔记2--在Cocos2d-x中显示一行文字

    在Cocos2d-x中要显示文字就需要用到Label控件.在3.x版本的Cocos2d中,舍弃了之前版本所使用的LabelTTF.LabelAtlas.LabelBMFont 3个用于显示文字的类,而 ...

  9. 阿里巴巴将在美国推出电子商务网站11 Main

    新浪科技讯 北京时间2月11日晚间消息,阿里巴巴集团周二向路透社证实,阿里巴巴将通过旗下子公司Vendio和Auctiva在美国推出一个电子商务网站. 该网站的名称为“11 Main”(11main. ...

  10. python3【基础】-集合

    集合( set):把不同的元素组成一起形成集合,是python基本的数据类型. 集合元素(set elements):组成集合的成员(不可重复) class set(object) | set() - ...