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. 【C#利用后台动态加载数据】Winform“防界面卡死”【BackgroundWorker】类

    using System.ComponentModel 直接使用EgProgressBar方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  2. 前端--javaScript之BOM和DOM

    BOM和DOM概述 BOM(Browser Object Model):是指浏览器对象模型,它使js有能力和浏览器进行"对话". DOM(Document Object Model ...

  3. Docker--从安装到搭建环境

    docker 1. ubuntu下安装docker 安装docker有两种方法: 一种是用官方的bash脚本一键安装. 直接一条命令就解决了: $ curl -sSL https://get.dock ...

  4. [转]git命令之git remote的用法

    git remote git  remote -v git init git add xxx git commit -m 'xxx' git remote add origin ssh://softw ...

  5. kafka浅谈

    关键词 producer       生产者 broker          缓存代理 consumer     消费者 partition       分区 topic            主题 ...

  6. rhel6 mysql skip-grant-tables 添加用户报错 ERROR 1290

    不小心把数据库密码忘掉了, 这个时候我们只需要在数据库的配置文件里面添加 skip-grant-tables 然后重新启动服务,再登录数据库就不要我们输入密码了 这个时候我成功登录数据,可是不小心又把 ...

  7. 月薪45K的Python爬虫工程师告诉你爬虫应该怎么学,太详细了!

    想用Python做爬虫,而你却还不会Python的话,那么这些入门基础知识必不可少.很多小伙伴,特别是在学校的学生,接触到爬虫之后就感觉这个好厉害的样子,我要学.但是却完全不知道从何开始,很迷茫,学的 ...

  8. webpack入门指南-step01

    一.webpack是什么? web开发中常用到的静态资源主要有JavaScript.CSS.图片.Jade等文件,webpack中将静态资源文件称之为模块.webpack是一个模块打包工具(命令行工具 ...

  9. 按照Right-BICEP要求设计的测试用例

    测试用例: 测试方法:Right-BICEP 测试要求: Right-结果是否正确? B-是否所有的边界条件都是正确的? P-是否满足性能要求? 题目是否有重复? 数量是否可定制? 数值范围是否可定制 ...

  10. OpenCV学习笔记——Mat类型数据存储

    CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number] 比如 CV_8UC3 表示 ...