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. 我们一起学习WCF 第一篇初识WCF(附源码供对照学习)

    前言:去年由于工作需要我学习了wcf的相关知识,初期对wcf的作用以及为何用怎么样都是一知半解,也许现在也不是非常的清晰.但是通过项目对wcf的运用在脑海里面也算有了初步的模型.今天我就把我从开始wc ...

  2. Intellij IDEA破解激活

    本文使用破解补丁激活Intellij IDEA 第一步:下载破解补丁(http://idea.lanyus.com/) 第二步:将下载好的补丁放置磁盘的任意位置,下面是我放置的位置 第三步:打开Int ...

  3. 微软职位内部推荐-Principal Group Program Manager

    微软近期Open的职位: Standard job title: Principal Group Program Manager Discipline: Program Management Prod ...

  4. [Linux] Migrate plugins and setting for vim

    Hot to migrate plugins and setting for vim from one computer to another ? Just copy  ~/.vim and ~/.v ...

  5. Scrum立会报告+燃尽图 04

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2194 一.小组介绍 组长:王一可 组员:范靖旋,王硕,赵佳璐,范洪达,祁玉 ...

  6. Python学习之路8 - 内置方法

    abs(-230) #取绝对值 all([0,1,-5]) #如果参数里面的所有值都为真就返回真,否则返回假 any([0,1,-5]) #如果参数里面有一个值为真则返回真,否则返回假 ascii([ ...

  7. mac安装php分词工具xunsearch出现找不到bio.h的解决办法

    下载xunsearch后安装出现如下错误,在xunsearch官方论坛未找到答案,此方案不仅用于参考解决安装xunsearch,其它编辑安装出现的问题同样可以参考 -n Checking scws . ...

  8. 02慕课网《进击Node.js基础(一)》——CommonJs标准

    是一套规范管理模块 每个js 为一个模块,多个模块作为一个包 node.js和Couchdb是对其的实现: 不同于jQuery 模块:定义.标识.引用(地址/模块名称) 模块类型: 核心模块http ...

  9. Android开发第二阶段(5)

    今天:对图片的替换修改,使整个app的图案化更美观. 明天:对Android的对sdcard的操作学习

  10. 软工实践-Alpha 冲刺 (8/10)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成非功能的主界面制作 ...