Luogu P3700「CQOI2017」小Q的表格
为什么我连分块都想不到啊...
题意
定义一个矩阵$f$满足
$ f(a,b)=f(b,a)$
$ b·f(a,a+b)=(a+b)·f(a,b)$
初始$ f(a,b)=ab$
有$ m$次修改,每次会将$ f(x,y)$改成$ c$,并修改这个矩阵使得仍然满足以上两条
保证修改后矩阵中每个数均为正整数
你需要在每次修改后求出$ \sum\limits_{i=1}^k\sum\limits_{j=1}^kf(i,j)$
数据范围满足$ m \leq 10000$,涉及到的矩形范围不超过$4·10^6$
$Solution $
给定的信息类似一个辗转相减的过程
和求$ gcd(x,y)$的过程非常像
我们不断辗转相减可以得到$ f(x,y)=f(d,d)*\frac{xy}{d^2}$
其中$ d=gcd(x,y)$
考虑求答案的式子的意义
$ ans=\sum\limits_{i=1}^k\sum\limits_{j=1}^kf(i,j)$
$ans=\sum\limits_{k=1}^nf(k,k)\sum\limits_{i=1}^{\frac{n}{k}}\sum\limits_{j=1}^{\frac{n}{k}}ij[gcd(i,j)=1]$
设
$ A(n)=\sum\limits_{i=1}^n\sum\limits_{j=1}^nij[gcd(i,j)=1]$
有
$A(n)=\sum\limits_{i=1}^n i^2\varphi(i)$
原理是若$ x<y,x和y互质则y-x和y互质$
这样可以化简为
$ans=\sum\limits_{k=1}^nf(k,k)A(\frac{n}{k})$
显然$ A(x)$可以预处理,然后数论分块计算
单次$ O(\sqrt{4000000})=O(2000)$
考虑修改
现在问题是:单点修改,区间求和
修改次数只有$ 10000$次,而求和次数达到$ 2*10^7$次
考虑分块
对于每个块我们维护块内前缀和以及前$ i$个块的和
这样查询是$ O(1)$的而修改是$ O(2000)$的
就以一种非常优秀的均摊复杂度解决了这道题
$ my \ code$
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define p 1000000007
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int i,j,k,m,n,x,y,z,cnt,blo;
int phi[],ss[],inv[],f[];bool pri[];
int val[],qz1[][],qz2[];
void init(int M){
//mu[1]=1;
phi[]=;blo=(int)sqrt(M);
for(rt i=;i<=M;i++){
if(!pri[i])phi[i]=i-,ss[++cnt]=i;
for(rt j=;j<=cnt&&i*ss[j]<=M;j++){
pri[i*ss[j]]=;
phi[i*ss[j]]=phi[i]*phi[ss[j]];
if(i%ss[j]==){
phi[i*ss[j]]=phi[i]*ss[j];
break;
}
}
}
for(rt i=;i<=M;i++)val[i]=(val[i-]+1ll*i*i%p*phi[i]%p)%p;
for(rt i=;i<=M;i++){
f[i]=1ll*i*i%p;
if((i-)%blo==)qz1[(i-)/blo][]=f[i];
else qz1[(i-)/blo][(i-)%blo]=(qz1[(i-)/blo][(i-)%blo-]+f[i])%p;
}
qz2[]=qz1[][blo-];
for(rt i=;i<=blo;i++)qz2[i]=(qz2[i-]+qz1[i][blo-])%p;
inv[]=inv[]=;
for(rt i=;i<=M;i++)inv[i]=1ll*inv[p%i]*(p-p/i)%p;
}
int qz(int x){
if(!x)return ;int ks=(x-)/blo;
if(ks==)return qz1[][x-];
else return (qz1[ks][(x-)%blo]+qz2[ks-])%p;
}
int calc(int n){
int ans=;
for(rt i=;i<=n;){
int R=n/(n/i);
(ans+=1ll*(qz(R)-qz(i-))*val[n/i]%p)%=p;
i=R+;
}
return (ans+p)%p;
}
void update(int x,int y){
int ks=(x-)/blo;
for(rt i=x;(i-)%blo!=||i==x;i++)(qz1[ks][(i-)%blo]+=y)%=p;
for(rt i=ks;i<=blo;i++)(qz2[i]+=y)%=p;
(f[x]+=y)%=p;
}
int main(){
n=read();m=read();
init(m);
for(rt i=;i<=n;i++){
x=read();y=read();int v=read()%p;k=read();
int gc=__gcd(x,y);
v=1ll*v*inv[x]%p*inv[y]%p*gc%p*gc%p;
update(gc,v-f[gc]);
writeln(calc(k));
}
return ;
}
Luogu P3700「CQOI2017」小Q的表格的更多相关文章
- 【LOJ】#3020. 「CQOI2017」小 Q 的表格
#3020. 「CQOI2017」小 Q 的表格 这个的话求出来\(g = gcd(a,b)\) 会修改所有gcd为g的位置 我们要求\((g,g)\)这个位置的数一定是\(g^{2}\)的倍数 之后 ...
- 「NOI2013」小 Q 的修炼 解题报告
「NOI2013」小 Q 的修炼 第一次完整的做出一个提答,花了半个晚上+一个上午+半个下午 总体来说太慢了 对于此题,我认为的难点是观察数据并猜测性质和读入操作 我隔一会就思考这个sb字符串读起来怎 ...
- 【CQOI2017】小Q的表格
[CQOI2017]小Q的表格 稍加推导就会发现\(f(a,b)=a\cdot b\cdot h(gcd(a,b))\). 初始时\(h(n)=1\). 询问前\(k\)行\(k\)列时我们就反演: ...
- 洛咕 P3700 [CQOI2017]小Q的表格
洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...
- loj #2008. 「SCOI2015」小凸想跑步
#2008. 「SCOI2015」小凸想跑步 题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...
- loj #2006. 「SCOI2015」小凸玩矩阵
#2006. 「SCOI2015」小凸玩矩阵 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...
- 「NOI2015」小园丁与老司机
「NOI2015」小园丁与老司机 要不是这道码农题,去年就补完了NOI2015,其实两问都比较simple,但是写起来很恶心. 先解决第一问,记 \(dp[i]\) 表示老司机到达第 \(i\) 棵树 ...
- bzoj 4815: [Cqoi2017]小Q的表格 [数论]
4815: [Cqoi2017]小Q的表格 题意: 单点修改,查询前缀正方形和.修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b) 一开始sb了认为一次只会 ...
- 「SCOI2015」小凸想跑步 解题报告
「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...
随机推荐
- Java 接口篇
为什么使用接口? 问题 要求实现防盗门的功能 分析 门有开和关的功能,锁有上锁和开锁的功能 将门和锁分别定义为抽奖类 那么问题就是防盗门即继承了门的同时又继承了锁,而Java的继承是单继承,接口可多继 ...
- (set stringstream)单词数 hdu2072
单词数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- day-17(基础加强)
回顾: listener(了解) 监听器,监听javaweb中三个域对象 监听对象的创建和销毁 ServletContextListener 在项目启动的时候加载配置文件 ServletRequest ...
- M1-Flask-Day3
内容概要: websocket mysql连接池 sqlalchemy flask-sqlalchemy 练习: 1. 谈谈Flask和Django的认识? Django大而全的框架,把Web相关设计 ...
- 使用Linux搭建FTP服务器实现文件共享
使用Linux搭建FTP服务器实现文件共享... ---------------- Linux中的文件共享:FTPVSFTPDVSFTPD虚拟用户 FTP可以用在Linux与Linux 和Window ...
- linux下安装SlickEdit
title: linux下安装SlickEdit tags: 软件 date: 2018-10-08 21:32:12 --- linux下安装SlickEdit 下载安装包和补丁文件 补丁文件 官方 ...
- 《Apache Kafka 实战》读书笔记-认识Apache Kafka
<Apache Kafka 实战>读书笔记-认识Apache Kafka 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.kafka概要设计 kafka在设计初衷就是 ...
- maven的安装与基本使用
一.什么是maven,有什么用? Maven是一个项目构建和管理的工具,其主要服务于基于java平台的项目构建.依赖管理和项目信息管理.它包含了一个项目对象模型 (Project Object Mod ...
- Hadoop记录-Yarn命令
概述 YARN命令是调用bin/yarn脚本文件,如果运行yarn脚本没有带任何参数,则会打印yarn所有命令的描述. 使用: yarn [--config confdir] COMMAND [--l ...
- Windows2012 要远程登录,你需要具有通过远程桌面服务进行登录的权限.
直接说正题... 提示如下: 解决办法: gpedit进入策略组:计算机配置->Windows设置->安全设置->本地策略->用户权限分配,找到拒绝通过远程桌面服务登录,把里面 ...