解题:SDOI 2014 数表
为了好写式子,先不管$a$的限制
设$facs$为因子和,那么有
$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^mfacs(gcd(i,j))$
再设$f(k)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[gcd(i,j)==k]$
熟悉的东西,再写一遍=。=
$f(k)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[gcd(i,j)==k]$
$=\sum\limits_{i=1}^{min(\left\lfloor\frac{n}{k}\right\rfloor,\left\lfloor\frac{m}{k}\right\rfloor)}μ(i)\left\lfloor\frac{n}{ik}\right\rfloor\left\lfloor\frac{m}{ik}\right\rfloor$
$\sum\limits_{i=1}^{min(n,m)}[k|i]μ(\frac{i}{k})\left\lfloor\frac{n}{i}\right\rfloor\left\lfloor\frac{m}{i}\right\rfloor$
那么
$ans=\sum\limits_{i=1}^{min(n,m)}facs(i)f(i)$
$=\sum\limits_{i=1}^{min(n,m)}facs(i)\sum_{d|i}μ(\frac{i}{d})\left\lfloor\frac{n}{i}\right\rfloor\left\lfloor\frac{m}{i}\right\rfloor$
$=\sum\limits_{i=1}^{min(n,m)}\left\lfloor\frac{n}{i}\right\rfloor\left\lfloor\frac{m}{i}\right\rfloor\sum_{d|i}facs(d)μ(\frac{i}{d})$
预处理后面的那个东西,前面的每次$O(\sqrt n)$回答
等等还有$a$的限制
先读进来按$a$排序,然后依次插入后面那个函数值,也就是单点修改+区间查询,树状数组解决
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=1e5,Mod=;
struct a
{
int n,m,a;
int idx,ans;
}qry[N];
struct b
{
int f,idx;
}sum[N];
int npr[N],pri[N],mul[N],bit[N],T,p,cnt;
bool cmp(a x,a y)
{
return x.a<y.a;
}
bool com(b x,b y)
{
return x.f<y.f;
}
bool cpr(a x,a y)
{
return x.idx<y.idx;
}
void Add(int pos,int tsk)
{
while(pos<=M)
bit[pos]+=tsk,pos+=pos&-pos;
}
int Query(int pos)
{
int ret=;
while(pos)
ret+=bit[pos],pos-=pos&-pos;
return ret;
}
void Prework()
{
npr[]=true,mul[]=,p=;
for(int i=;i<=M;i++)
{
if(!npr[i]) pri[++cnt]=i,mul[i]=-;
for(int j=;j<=cnt&&i*pri[j]<=M;j++)
{
npr[i*pri[j]]=true;
if(i%pri[j]==) break;
else mul[i*pri[j]]=-mul[i];
}
}
for(int i=;i<=M;i++) sum[i].idx=i;
for(int i=;i<=M;i++)
for(int j=i;j<=M;j+=i) sum[j].f+=i;
}
int Solve(int n,int m)
{
int ret=;
if(n>m) swap(n,m);
for(int i=,j;i<=n;i=j+)
{
j=min(n/(n/i),m/(m/i));
ret+=(n/i)*(m/i)*(Query(j)-Query(i-));
}
return ret&Mod;
}
int main()
{
Prework();
scanf("%d",&T);
for(int i=;i<=T;i++)
scanf("%d%d%d",&qry[i].n,&qry[i].m,&qry[i].a),qry[i].idx=i;
sort(qry+,qry++T,cmp);
sort(sum+,sum++M,com);
for(int i=;i<=T;i++)
{
while(p<=M&&sum[p].f<=qry[i].a)
{
for(int j=sum[p].idx;j<=M;j+=sum[p].idx)
Add(j,mul[j/sum[p].idx]*sum[p].f); p++;
}
qry[i].ans=Solve(qry[i].n,qry[i].m);
}
sort(qry+,qry++T,cpr);
for(int i=;i<=T;i++) printf("%d\n",qry[i].ans);
return ;
}
解题:SDOI 2014 数表的更多相关文章
- [SDOI 2014]数表
Description 有一张N×m的数表,其第i行第j列(1 < =i < =N,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...
- 「BZOJ 3529」「SDOI 2014」数表「莫比乌斯反演」
题意 有一张 \(n\times m\) 的数表,其第\(i\)行第\(j\)列的数值为能同时整除\(i\)和\(j\)的所有自然数之和. \(T\)组数据,询问对于给定的 \(n,m,a\) , 计 ...
- 【BZOJ 3529】【SDOI 2014】数表
看Yveh的题解,这道题卡了好长时间,一直不明白为什么要······算了当时太naive我现在都不好意思说了 #include<cstdio> #include<cstring> ...
- 解题:SDOI 2014 重建
题面 做这个这个题需要稍微深入理解一点矩阵树定理:套矩阵树定理得到的东西是有意义的,它是“所有生成树边权乘积之和”(因为度数矩阵是点的边权和,邻接矩阵是边权),即$\sum_{t}\prod_{e∈t ...
- 【SDOI 2014】数表
题意 https://loj.ac/problem/2193 题解 显然就是求 $\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} \sigma_1(\gcd{ ...
- 【BZOJ 3531】【SDOI 2014】旅行
因为有$10^5$个宗教,需要开$10^5$个线段树. 平时开的线段树是“满”二叉树,但在这个题中代表一个宗教的线段树管辖的区间有很多点都不属于这个宗教,也就不用“把枝叶伸到这个点上”,所以这样用类似 ...
- [BZOJ 3530][Sdoi 2014]数数
阿拉~好像最近总是做到 AC 自动机的题目呢喵~ 题目的算法似乎马上就能猜到的样子…… AC 自动机 + 数位 dp 先暴力转移出 f[i][j] :表示从 AC 自动机上第 j 号节点走 i 步且不 ...
- BZOJ 3533 sdoi 2014 向量集
设(x,y)为Q的查询点,分类讨论如下:1.y>0: 最大化a*x+b*y,维护一个上凸壳三分即可 2.y<0:最大化a*x+b*y 维护一个下凸壳三分即可 我们考虑对时间建出一棵线段 ...
- 【BZOJ 3530】【SDOI 2014】数数
http://www.lydsy.com/JudgeOnline/problem.php?id=3530 上午gty的测试题,爆0了qwq 类似文本生成器那道题,把AC自动机的转移建出来,准确地说建出 ...
随机推荐
- Netty源码分析第1章(Netty启动流程)---->第3节: 服务端channel初始化
Netty源码分析第一章:Netty启动流程 第三节:服务端channel初始化 回顾上一小节的initAndRegister()方法: final ChannelFuture initAndRe ...
- Redis源码阅读(五)集群-故障迁移(上)
Redis源码阅读(五)集群-故障迁移(上) 故障迁移是集群非常重要的功能:直白的说就是在集群中部分节点失效时,能将失效节点负责的键值对迁移到其他节点上,从而保证整个集群系统在部分节点失效后没有丢失数 ...
- Ubuntu16.04安装vmware workstation14
1.获得vmware安装包:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html?ClickI ...
- node child_process模块
NodeJs是一个单进程的语言,不能像Java那样可以创建多线程来并发执行.当然在大部分情况下,NodeJs是不需要并发执行的,因为它是事件驱动性永不阻塞.但单进程也有个问题就是不能充分利用CPU的多 ...
- python之multiprocessing创建进程
python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. multiprocessing创建多进程在windows和linux系统下的 ...
- Beta发布文案+美工
团队名称:探路者 1蔺依铭:http://www.cnblogs.com/linym762/(组长) 2张恩聚:http://www.cnblogs.com/zej87/ 3米赫:http://www ...
- 面向对象OO第1-3次作业总结
面向对象OO第1-3次作业总结 学习OO已经四周了,对OO以及JAVA的编程也算终于了解了一丢丢.现在做完了三次的编程作业,对前三次的作业做一次总结. 第一次作业 ------------------ ...
- 解决Cygwin编译cocos2dx 遇到的 error: 'UINT64_C' was not declared in this scope 问题
环境工具:Win10.VS2013.cocos2d-x-2.2.6.Cygwin.ADT 问题来源:写了一个小游戏,VS2013上运行成功,就尝试着打包apk,项目导入到ADT里面,添加了cocos2 ...
- IO文件的读取,以及写入文件内容
package zxc; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fi ...
- java常见字符集
ASCII 名称由来 ASCII(American Standard Code for Information Interchange,美国信息互换标准编码)是基于罗马字母表的一套电脑编码系统.[1] ...