洛谷 P3700 - [CQOI2017]小Q的表格(找性质+数论)
又是一道需要一些观察的数论 hot tea……
注意到题目中 \(b·f(a,a+b)=(a+b)·f(a,b)\) 这个柿子长得有点像求解 \(\gcd\) 的辗转相除法,因此考虑从这方面入手解决这道题,不难发现对于两个数 \((a,b)\),通过辗转相除法咱们总可以得到 \(f(\gcd(a,b),\gcd(a,b))\) 处。那么我们考虑归纳求出 \(f(a,b)\) 是个什么东西,记 \(d=\gcd(a,b)\),由于我们不管怎么辗转相除都只能除到 \(f(d,d)\) 处,因此我们保持 \(f(d,d)\) 不变好了,那么 \(f(d,2d)=2f(d,d),f(d,3d)=3f(d,d),\cdots,f(d,kd)=kf(d,d)\),而 \(f((k+1)d,kd)=(k+1)f(d,kd)=k(k+1)f(d,d)\),\(f((2k+1)d,kd)=\dfrac{2k+1}{k+1}·f((k+1)d,kd)=(2k+1)kf(d,d)\),如此归纳下去不难得出:
\]
也就是说我们只用维护所有 \(f(d,d)\) 的变化即可。
注意到当我们改变某个 \(f(a,b)=x\) 时候,由于 \(f(a,b)=\dfrac{ab}{\gcd(a,b)^2}f(\gcd(a,b),\gcd(a,b))\),因此改变 \(f(a,b)\) 会影响 \(f(\gcd(a,b),\gcd(a,b))\),也进而影响其他满足 \(\gcd(x,y)=\gcd(a,b)\) 的 \(f(x,y)\) 的值。而对于 \(d\ne\gcd(a,b)\),改变 \(f(a,b)\) 显然是不会影响 \(f(d,d)\) 的值的,因此改变 \(f(a,b)\) 只会影响一个 \(f(d,d)\) 的值。
接下来考虑求解答案。
ans&=\sum\limits_{i=1}^k\sum\limits_{j=1}^k\dfrac{ij}{\gcd(i,j)^2}f(\gcd(i,j),\gcd(i,j))\\
&=\sum\limits_{d=1}^kf(d,d)\dfrac{1}{d^2}\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{n/d}id·jd[\gcd(i,j)=1]\\
&=\sum\limits_{d=1}^kf(d,d)\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{n/d}ij[\gcd(i,j)=1]\\
\end{aligned}
\]
设
\]
那么
\]
我们先不考虑 \(g(x)\) 怎么求,假设我们已经求得了所有 \(g(x)\),那么显然可以对 \(\lfloor\dfrac{k}{d}\rfloor\) 整除分块,那么我们需要求出 \(f(d,d)\) 的前缀和,又因为要修改,因此我们需要一个支持修改、查询前缀和的数据结构。有人肯定会想树状数组,不过对于此题而言,由于修改次数为 \(m\),查询次数为 \(m\sqrt{n}\),因此直接 BIT 复杂度为 \(m\sqrt{n}\log n\) 无法通过,因此考虑根号平衡的思想,众所周知分块可以实现 \(\mathcal O(\sqrt{n})\) 修改 \(\mathcal O(1)\) 查询前缀和,使用这样的数据结构维护一下即可 \(\mathcal O(m\sqrt{n})\) 查询。
最后考虑 \(g(x)\) 怎么求,直接整除分块是 \(n\sqrt{n}\) 的,无法通过。因此考虑不反演。首先证明一个 Lemma:
\]
证明大概就 \(\forall i\le x\),若 \(i\perp x\),那么 \((x-i)\perp x\),那么我们就对于所有 \(i\le x,i\perp x\),将 \(i\) 与 \(x-i\) 配对形成一个 \(x\) 即可,这样共可以配成 \(\dfrac{\varphi(x)}{2}\) 对,然后对 \(x=1\) 和 \(x=2\) 特判一下即可。
又这个引理可知
g(x)&=g(x-1)+2x\sum\limits_{i=1}^xi[\gcd(i,x)=1]-\epsilon(x)\\
&=g(x-1)+x^2(\varphi(x)+\epsilon(x))-\epsilon(x)\\
&=g(x-1)+x^2\varphi(x)
\end{aligned}
\]
因此
\]
线筛算算即可。
const int MAXN=4e6;
const int BLK=2000;
const int MOD=1e9+7;
void pls(int &x,int v){((x+=v)>=MOD)&&(x-=MOD);}
int n,qu,phi[MAXN+5],pr[MAXN/8+5],prcnt=0,s[MAXN+5];
bitset<MAXN+5> vis;
void sieve(int n){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]) phi[i]=i-1,pr[++prcnt]=i;
for(int j=1;j<=prcnt&&pr[j]*i<=n;j++){
vis[pr[j]*i]=1;
if(i%pr[j]==0){phi[i*pr[j]]=phi[i]*pr[j];break;}
else phi[i*pr[j]]=phi[i]*phi[pr[j]];
}
}
for(int i=1;i<=n;i++) s[i]=(s[i-1]+1ll*i*i%MOD*phi[i])%MOD;
}
int L[BLK+5],R[BLK+5],bel[MAXN+5],blk_cnt,blk_sz;
int sum_blk[BLK+5],sum_tot[MAXN+5];
void add(int x,int v){
for(int i=bel[x];i<=blk_cnt;i++) pls(sum_blk[i],v);
for(int i=x;i<=R[bel[x]];i++) pls(sum_tot[i],v);
}
int ask(int x){if(!x) return 0;return (sum_blk[bel[x]-1]+sum_tot[x])%MOD;}
int f[MAXN+5];
int main(){
scanf("%d%d",&qu,&n);sieve(n);
// for(int i=1;i<=n;i++) printf("%d\n",s[i]);
blk_sz=(int)sqrt(n);blk_cnt=(n-1)/blk_sz+1;
int sum=0;
for(int i=1;i<=blk_cnt;i++){
L[i]=(i-1)*blk_sz+1;R[i]=min(i*blk_sz,n);int sum0=0;
for(int j=L[i];j<=R[i];j++){
bel[j]=i;sum0=(sum0+1ll*j*j)%MOD;
sum_tot[j]=sum0;f[j]=1ll*j*j%MOD;
// printf("%d %d\n",j,sum0);
} pls(sum,sum0);sum_blk[i]=sum;
// printf("%d %d\n",i,sum);
}
while(qu--){
int a,b,k;ll v;scanf("%d%d%lld%d",&a,&b,&v,&k);
int d=__gcd(a,b);add(d,(MOD-f[d])%MOD);
f[d]=(v/(1ll*a*b/d/d))%MOD;add(d,f[d]);
int res=0;
for(int l=1,r;l<=k;l=r+1){
r=k/(k/l);
// printf("%d %d %d\n",l,r,(ask(r)-ask(l-1)+MOD)%MOD);
res=(res+1ll*(ask(r)-ask(l-1)+MOD)*s[k/l])%MOD;
} printf("%d\n",res);
}
return 0;
}
洛谷 P3700 - [CQOI2017]小Q的表格(找性质+数论)的更多相关文章
- [bzoj4815] [洛谷P3700] [Cqoi2017] 小Q的表格
Description 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向你求助.为了完成任务,小Q需要列一个表格 ...
- 洛咕 P3700 [CQOI2017]小Q的表格
洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...
- 洛谷 P3698 [CQOI2017]小Q的棋盘 解题报告
P3698 [CQOI2017]小Q的棋盘 题目描述 小 Q 正在设计一种棋类游戏. 在小 Q 设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上 ...
- BZOJ4813或洛谷3698 [CQOI2017]小Q的棋盘
BZOJ原题链接 洛谷原题链接 贪心或树形\(DP\)都可做,但显然\(DP\)式子不好推(因为我太菜了),所以我选择贪心. 很显然从根出发主干走最长链是最优的,而剩下的点每个都需要走两步,所以用除去 ...
- 洛谷P3698 [CQOI2017]小Q的棋盘
传送门 考虑一个贪心,先在根节点周围转一圈,然后再往下走最长链肯定是最优的 然后设最长链的长度为$d$,如果$m\leq d$,那么答案为$m+1$ 否则的话还剩下$m-d+1$步,又得保证能走回来, ...
- 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)
[BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...
- bzoj 4815: [Cqoi2017]小Q的表格 [数论]
4815: [Cqoi2017]小Q的表格 题意: 单点修改,查询前缀正方形和.修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b) 一开始sb了认为一次只会 ...
- [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演)
4815: [Cqoi2017]小Q的表格 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 832 Solved: 342[Submit][Statu ...
- [bzoj4815]: [Cqoi2017]小Q的表格
来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. ...
随机推荐
- Golang通脉之流程控制
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的"经脉". Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码. ...
- vue3.x新特性之setup函数,看完就会用了
最近有小伙伴跟我聊起setup函数,因为习惯了vue2.x的写法导致了,setup用起来觉得奇奇怪怪的,在一些api混编的情况下,代码变得更加混乱了,个人觉得在工程化思想比较强的团队中使用setup确 ...
- 第五次Scrum Metting
日期:2021年5月2日 会议主要内容概述:讨论前端进度,修改后端接口. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 模板模块的实现及批量插入更 ...
- [对对子队]会议记录4.11(Scrum Meeting 2)
今天已完成的工作 何瑞 工作内容:完成指令的衔接:完成合成指南界面的制作:初步实现成本系统 相关issue:实现用户指令编辑系统的逻辑 马嘉 工作内容:完成游戏内暂停界面 相关issu ...
- Vue3+Typescript+Node.js实现微信端公众号H5支付(JSAPI v3)教程--各种填坑
----微信支付文档,不得不说,挺乱!(吐槽截止) 功能背景 微信公众号中,点击菜单或者扫码,打开公众号中的H5页面,进行支付. 一.技术栈 前端:Vue:3.0.0,typescript:3.9.3 ...
- 线路由器频段带宽是是20M好还是40M好
无线路由器频段带宽还是40M好. 40M的信号强,速度快. 1.20MHz在11n的情况下能达到144Mbps带宽.穿透性不错.传输距离较远 40MHz在11n的情况下能达到300Mbps带宽.穿 ...
- JAVA笔记12__字节、字符缓冲流/打印流/对象流/
/** * !!:以后写流的时候一定要加入缓冲!! * 对文件或其它目标频繁的读写操作,效率低,性能差. * 缓冲流:好处是能更高效地读写信息,原理是将数据先缓冲起来,然后一起写入或读取出来. * * ...
- python基础数据类型语法
#标识符:我们自己在写代码的时候,取的名字.#项目名 project name#包名 package name#模块名 .py ptthon文件名#规范:由字母数字下划线组成,但不能以数字#简明知意: ...
- 基于Lucene的全文检索实践
由于项目的需要,使用到了全文检索技术,这里将前段时间所做的工作进行一个实践总结,方便以后查阅.在实际的工作中,需要灵活的使用lucene里面的查询技术,以达到满足业务要求与搜索性能提升的目的. 一.全 ...
- 【java+selenium3】模拟键盘操作 (十二)
一.键盘操作 用代码来模拟键盘的Enter或一系列的组合键,前面使用sendkeys()方法模拟键盘的输入,除此之外还可以模拟键盘组合键输入如下: 整理一些比较常用的键盘操作如下: sendKeys( ...