[CQOI2017] 小Q的表格(分块 + 整除分块 + 数学 + 前缀和)

problem

luogu-P3700

solution

  • f(a,b)=f(b,a)f(a,b)=f(b,a)f(a,b)=f(b,a) 意味着我们只用考虑半个棋盘的信息。

  • b∗f(a,a+b)=(a+b)∗f(a,b)b*f(a,a+b)=(a+b)*f(a,b)bf(a,a+b)=(a+b)f(a,b)

    会发现修改 f(a,b)f(a,b)f(a,b) 就影响 f(a,a+b)f(a,a+b)f(a,a+b) 进而影响 f(a,a+2b)…f(a,a+2b)\dotsf(a,a+2b)

    对于这个信息,如果对数学很敏感的选手,就会直接猜跟 gcd⁡\gcdgcd 挂钩了。

    向我们这种凡人呢就只能听天由命了

    考虑这个性质之所以很难使用上,是因为这两个式子的系数只有一项,且是与等式对面的 f(x,y)f(x,y)f(x,y) 挂钩的。

    这种跟对面挂钩的我们会想到比例式,因为我们清楚如果分母和分子相同是可以约分的。

    当写成比例式 f(a,a+b)a+b=f(a,b)b\frac{f(a,a+b)}{a+b}=\frac{f(a,b)}{b}a+bf(a,a+b)=bf(a,b),我们才会稍微察觉到如果两边都再除以一个 aaa,整体形式就很同构了。

    f(a,a+b)a∗(a+b)=f(a,b)a∗b\frac{f(a,a+b)}{a*(a+b)}=\frac{f(a,b)}{a*b}a(a+b)f(a,a+b)=abf(a,b) 加减运算不影响 gcd⁡\gcdgcd 的值。

    递归辗转相除最后就会得到 f(a,b)a∗b=f(gcd⁡(a,b),gcd⁡(a,b))gcd⁡(a,b)2\frac{f(a,b)}{a*b}=\frac{f\big(\gcd(a,b),\gcd(a,b)\big)}{\gcd(a,b)^2}abf(a,b)=gcd(a,b)2f(gcd(a,b),gcd(a,b))

    所以我们可以得出:修改 f(x,y)f(x,y)f(x,y) 只会影响 gcd⁡(x,y)=gcd⁡(a,b)\gcd(x,y)=\gcd(a,b)gcd(x,y)=gcd(a,b) 的所有 f(a,b)f(a,b)f(a,b) 的值


继续考虑处理询问,这就要推式子了。
∑i=1n∑j=1nf(i,j)=∑i=1n∑j=1ni×jgcd⁡(i,j)2f(i,j)=∑d=1nf(d,d)∑i=1⌊nd⌋∑j=1⌊nd⌋i×j⋅[gcd⁡(i,j)=1]\sum_{i=1}^n\sum_{j=1}^nf(i,j)=\sum_{i=1}^n\sum_{j=1}^n\frac{i\times j}{\gcd(i,j)^2}f(i,j)=\sum_{d=1}^nf(d,d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac nd\rfloor}i\times j·[\gcd(i,j)=1] i=1nj=1nf(i,j)=i=1nj=1ngcd(i,j)2i×jf(i,j)=d=1nf(d,d)i=1dnj=1dni×j[gcd(i,j)=1]

∑k=1n[gcd⁡(k,n)=1]⋅k=∑k=1nk∑d∣kμ(d)=∑d∣nμ(d)∑d∣kk=∑d∣nμ(d)∗d∑i=1⌊nd⌋i=∑d∣nμ(d)∗d∗(⌊nd⌋+1)∗⌊nd⌋2=n⋅(∑d∣nμ(d)+n∑d∣nμ(d)d)2=n⋅(φ(n)+[n=1])2\sum_{k=1}^n[\gcd(k,n)=1]·k\\ =\sum_{k=1}^nk\sum_{d\mid k}\mu(d)=\sum_{d\mid n}\mu(d)\sum_{d\mid k}k=\sum_{d\mid n}\mu(d)*d\sum_{i=1}^{\lfloor\frac nd\rfloor}i\\ =\sum_{d\mid n}\mu(d)*d*\frac{(\lfloor\frac nd\rfloor+1)*\lfloor\frac nd\rfloor}{2}=\frac{n·\Big(\sum_{d\mid n}\mu(d)+n\sum_{d\mid n}\frac{\mu(d)}{d}\Big)}{2}\\ =\frac{n·\Big(\varphi(n)+[n=1]\Big)}{2} k=1n[gcd(k,n)=1]k=k=1nkdkμ(d)=dnμ(d)dkk=dnμ(d)di=1dni=dnμ(d)d2(dn+1)dn=2n(dnμ(d)+ndndμ(d))=2n(φ(n)+[n=1])

根据两个基础数论结论:∑d∣nμ(d)=[n=1],∑d∣nμ(d)d=φ(n)n\sum_{d\mid n}\mu(d)=[n=1],\sum_{d\mid n}\frac{\mu(d)}{d}=\frac{\varphi(n)}{n}dnμ(d)=[n=1],dndμ(d)=nφ(n) 得出最后一个等式。

∑d=1nf(d,d)∑i=1⌊nd⌋∑j=1⌊nd⌋i×j⋅[gcd⁡(i,j)=1]≠∑d=1nf(d,d)∑i=1⌊nd⌋∑j=1⌊nd⌋i⋅i⋅(φ(i)+[i=1])2\sum_{d=1}^nf(d,d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac nd\rfloor}i\times j·[\gcd(i,j)=1]\ne\sum_{d=1}^nf(d,d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac nd\rfloor}i·\frac{i·(\varphi(i)+[i=1])}{2} d=1nf(d,d)i=1dnj=1dni×j[gcd(i,j)=1]=d=1nf(d,d)i=1dnj=1dni2i(φ(i)+[i=1])

这个式子之所以不能直接用上面的结论,是因为这里的 jjj 可能大于 iii,根据对称性,×2\times 2×2 即可。

但这样就会把所有 i=ji=ji=j 的情况重复算了一遍,但除了 i=j=1i=j=1i=j=1 外其余都不满足最大公约数为 111 的限制。

i=j=1i=j=1i=j=1 的贡献是 111,而 1×φ(1)+[i=1]2×2=2\frac{1\times \varphi(1)+[i=1]}{2}\times 2=221×φ(1)+[i=1]×2=2,我们可以直接扔掉 [i=1][i=1][i=1],这样这种情况算出来的贡献就是对的。

且对于 i>1i>1i>1 的情况去掉 [i=1][i=1][i=1] 的特判没有影响。
=∑d=1nf(d,d)∑i=1⌊nd⌋i⋅i∗φ(i)2×2=∑d=1nf(d,d)∑i=1⌊nd⌋i2φ(i)=\sum_{d=1}^nf(d,d)\sum_{i=1}^{\lfloor\frac nd\rfloor}i·\frac{i*\varphi(i)}{2}\times2=\sum_{d=1}^nf(d,d)\sum_{i=1}^{\lfloor\frac nd\rfloor}i^2\varphi(i) =d=1nf(d,d)i=1dni2iφ(i)×2=d=1nf(d,d)i=1dni2φ(i)
S(n)=∑i=1ni2φ(i)S(n)=\sum_{i=1}^ni^2\varphi(i)S(n)=i=1ni2φ(i),则答案即为 ∑d=1nf(d,d)S(⌊nd⌋)\sum_{d=1}^nf(d,d)S(\lfloor\frac nd\rfloor)d=1nf(d,d)S(dn)

然后似乎就可以整除分块了,然而整除分块还要用到 fff 的前缀和。

很遗憾,这个 fff 还要是支持修改的,所以需要一个数据结构。

树状数组查询 O(mnlog⁡n)O(m\sqrt n\log n)O(mnlogn) 不太行,但修改却只有一个 log⁡\loglog 很快。当然这也能过。

我们需要平衡一下查询和修改的时间复杂度,那就是分块啦!

直接把 fff 变成 fff 的前缀和,单点修改变成区间修改 gcd⁡(a,b)∼n\gcd(a,b)\sim ngcd(a,b)n,之后查询前缀和就变成了单点询问了。

具体而言 f(a,b)←xf(a,b)\leftarrow xf(a,b)x,即为 f(gcd⁡(a,b),gcd⁡(a,b))←x⋅gcd⁡(a,b)2abf(\gcd(a,b),\gcd(a,b))\leftarrow \frac{x·\gcd(a,b)^2}{ab}f(gcd(a,b),gcd(a,b))abxgcd(a,b)2(这个是由上面最开始递归辗转相除的式子变形得来的)

code

#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define mod 1000000007
#define maxn 4000005
#define maxB 2005
int m, n, cnt;
int a[maxn], block[maxn], L[maxB], R[maxB], f[maxn], g[maxB], phi[maxn], s[maxn], prime[maxn], vis[maxn];int gcd( int x, int y ) {if( ! y ) return x;else return gcd( y, x % y );
}void init() {int B = sqrt( n );for( int i = 1;i <= n;i ++ ) {a[i] = i * i % mod;f[i] = ( f[i - 1] + a[i] ) % mod;block[i] = ( i - 1 ) / B + 1;}for( int i = n;i >= 1;i -- ) L[block[i]] = i; for( int i = 1;i <= n;i ++ ) R[block[i]] = i;
}
void modify( int l, int r, int x ) {int k = x - a[l]; a[l] = x;if( block[l] == block[r] )for( int i = l;i <= r;i ++ ) f[i] = ( f[i] + k ) % mod;else {for( int i = l;i <= R[block[l]];i ++ ) f[i] = ( f[i] + k ) % mod;for( int i = L[block[r]];i <= r;i ++ ) f[i] = ( f[i] + k ) % mod;for( int i = block[l] + 1;i < block[r];i ++ ) g[i] = ( g[i] + k ) % mod;}
}
int query( int x ) { return ( f[x] + g[block[x]] ) % mod; }void sieve() {phi[1] = 1;for( int i = 2;i <= n;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, phi[i] = i - 1;for( int j = 1;j <= cnt and i * prime[j] <= n;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {phi[i * prime[j]] = phi[i] * prime[j] % mod;break;}elsephi[i * prime[j]] = phi[i] * phi[prime[j]] % mod;}}for( int i = 1;i <= n;i ++ ) s[i] = ( s[i - 1] + i * i % mod * phi[i] ) % mod;
}
int solve( int n ) {int ans = 0;for( int l = 1, r;l <= n;l = r + 1 ) {r = n / ( n / l );ans = ( ans + ( query( r ) - query( l - 1 ) ) * s[n / l] ) % mod;}return ans;
}signed main() {scanf( "%lld %lld", &m, &n );init();sieve();for( int i = 1, a, b, x, k;i <= m;i ++ ) {scanf( "%lld %lld %lld %lld", &a, &b, &x, &k );int d = gcd( a, b );x = x / ( a / d ) / ( b / d ) % mod;modify( d, n, x );printf( "%lld\n", ( solve( k ) + mod ) % mod );}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Orleans MultiClient 多个Silo复合客户端

介绍Orleans.MultiClient 是一个 Orleans 复合客户端&#xff0c;只需要简单配置就可以简单高效连接和请求 Orleans 服务。Orleans.MultiClient 可以轻松连接多个不同服务的 Orleans 服务,在请求 Orleans 时会根据请求的接口自动寻找 Orleans 客户端&#xff0c;使用者无需关心…

[kuangbin]各种各样的题单

[kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 FZU 2150 UVA 11624 POJ 3984 HDU 1241 HDU 1495 HDU 2612 专题2 搜索进阶 HDU 1043 HDU 3567 HDU 2181 HDU 3533 HDU 1560 ZOJ 2477 HDU 3085 HDU 1067 HD…

[CQOI2017] 小Q的棋盘(贪心 / 树形dp)

problem luogu-P3698 solution1-贪心 显然我们想尽可能地少走回头路&#xff0c;即一直往下走。 所以我们可以都会有个初步地猜测是走最长链。 但很快就会想到万一这是一条单链&#xff0c;链中的点都是二度点&#xff0c;走得越深回头浪费的步数也越多。 然后就可能直接…

ASP.NET Core 进程内(InProcess)托管(6)《从零开始学ASP.NET CORE MVC》:

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core 中的 Main方法ASP.NET Core 进程内(InProcess)托管在这个视频中我们将讨论在ASP.NET Core中的进程内(InProcess)托管模型什么是Kestrel服务器当一个 ASP.NET Core 应用程序执行的时候&#xff0c;.NET…

约会安排 HDU - 4553

约会安排 HDU - 4553 题意&#xff1a; 题意又丑又长就不叙述了 题解&#xff1a; 这个题一开始理解错了。。。题目相当于是有三种情况占据时间&#xff0c;分别是学习&#xff0c;女神和屌丝&#xff0c;我们用不同的lazy来表示女神和屌丝&#xff0c;根据优先级去更新状态…

ML.NET机器学习、API容器化与Azure DevOps实践(一):简介

打算使用几篇文章介绍一下.NET下的机器学习框架ML.NET的具体应用&#xff0c;包括一些常用的业务场景、算法的选择、模型的训练以及RESTful API的创建、机器学习服务容器化&#xff0c;以及基于Azure DevOps的容器化部署等等相关的内容。如果你从来没有玩过机器学习&#xff0c…

[TJOI2011] 书架(线段数优化dp + 单调栈)

problem luogu-P1295 首先可以列出一个暴力 dpdpdp 转移。 设 f(i):f(i):f(i): 到 iii 为止划分若干组&#xff0c;每组最大值的和 的最小值。 然后枚举最后一组&#xff0c;即 iii 所在组的开头 jjj&#xff0c;则 f(i)min⁡{f(j−1)max⁡j≤k≤i{ak}}f(i)\min\Big\{f(j-1…

Picture POJ - 1177(矩形周长并))

Picture POJ - 1177 题目&#xff1a; 多个矩阵相交在一起&#xff0c;问新图形的周长是多少 题解&#xff1a; 参考题解 周长分为两部分&#xff1a;横线和竖线 横线计算方法&#xff1a;现在总区间被覆盖的长度和上一次总区间被覆盖的长度之差的绝对值 那么我们只需要从…

聊一聊C# 8.0中的await foreach

很开心今天能与大家一起聊聊C# 8.0中的新特性-Async Streams,一般人通常看到这个词表情是这样.简单说,其实就是C# 8.0中支持await foreach.或者说,C# 8.0中支持异步返回枚举类型async Task<IEnumerable<T>>.好吧,还不懂?Good,这篇文章就是为你写的,看完这篇文章,你…

【学习笔记】同余最短路

同余最短路是用来解决一类 ∑i1naixi∈[L,R]\sum_{i1}^n a_ix_i\in[L,R]∑i1n​ai​xi​∈[L,R] 问题的方法。 其中 L,RL,RL,R 值非常大&#xff0c;而 nnn 不是很大&#xff0c;大概是接受 O(n2)O(n^2)O(n2) 的范围&#xff0c;xix_ixi​ 是自定义的系数。 先差分一下&#…

Codeforces Round #738 (Div. 2)

Codeforces Round #738 (Div. 2) 文章目录A题解&#xff1a;代码&#xff1a;B题意&#xff1a;题解&#xff1a;代码&#xff1a;C题意&#xff1a;题解&#xff1a;代码&#xff1a;D1题意&#xff1a;题解&#xff1a;代码:题号题目知识点AMocha and MathBMocha and Red and…

ASP.NET Core 实现带认证功能的Web代理服务器

引言最近在公司开发了一个项目&#xff0c;项目部署架构图如下&#xff1a;思路如图中文本所述&#xff0c;公司大数据集群不允许直接访问外网&#xff0c;需要一个网关服务器代理请求&#xff0c;本处服务器A就是边缘代理服务器的作用。通常技术人员最快捷的思路是在服务器A上…

[ZJOI2010] 排列计数(dp + 组合数)

problem luogu-P2606 solution 我们对 i−⌊i2⌋i-\lfloor\frac i2\rfloori−⌊2i​⌋ 远没有 i−2∗i,2∗i1i-2*i,2*i1i−2∗i,2∗i1 敏感&#xff0c;这其实就是个二叉树&#xff0c;而且是个小根堆。 每个点的值都小于左右儿子的值&#xff08;如果有左右儿子&#xff0…

Unfair contest(个人做法)

Unfair contest 题意&#xff1a; 两个人参赛&#xff0c;n个评委打分&#xff0c;去掉s个最高分&#xff0c;去掉t个最低分&#xff0c;剩下分求平均分&#xff0c;平均分大的获胜。你是第n个评委&#xff0c;此时已知前n-1个评委所打分数&#xff0c;现在轮到你打分&#x…

ASP.NET Core 进程外(out-of-process)托管(7)《从零开始学ASP.NET CORE MVC》

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core 进程内(InProcess)托管ASP.NET Core 进程内(InProcess)托管我们先简单回顾下 ASP.NET Core 中,要配置InProcess的服务器&#xff0c;需要在项目文件中添加< AspNetCoreHostingModel >元素&#…

[CQOI2017] 老C的键盘(树形dp + 组合数)

problem luogu-P3757 solution observation:\text{observation}:observation: hi/2−hih_{i/2}-h_ihi/2​−hi​ 的大小关系&#xff0c;其实就是个二叉树的大小关系。 这很类似之前的排列 dpdpdp &#xff0c;迁移过来&#xff0c;我们尝试 f(i,j):if(i,j):if(i,j):i 在子树…

Educational Codeforces Round 112 (Rated for Div. 2)

Educational Codeforces Round 112 (Rated for Div. 2) 题号题目知识点APizzaForcesBTwo TablesCCoin RowsDSay No to PalindromesEBoring Segments尺取线段树FGood GraphLCT(未补)

eShopOnContainers 知多少[10]:部署到 K8S | AKS

1. 引言断断续续&#xff0c;感觉这个系列又要半途而废了。趁着假期&#xff0c;赶紧再更一篇&#xff0c;介绍下如何将eShopOnContainers部署到K8S上&#xff0c;进而实现大家常说的微服务上云。2. 先了解下 Helm读过我上篇文章ASP.NET Core 借助 K8S 玩转容器编排的同学&…

[HEOI2013] SAO(dp + 组合数 + 前缀和)

problem luogu-P4099 solution 两篇前提题解&#xff1a;排列计数&#xff0c;老C的键盘 想必已经看了 CQOI2017 老C的键盘 一题题解了。 这里直接考虑优化状态转移方程。 我们发现 f(u,i),f(v,j)f(u,i),f(v,j)f(u,i),f(v,j)&#xff0c;当枚举 jjj 后&#xff0c;对应的…

cf1555A. PizzaForces

cf1555A. PizzaForces A. PizzaForces 题意&#xff1a; 有三种披萨&#xff0c;第一种有六块&#xff0c;需要花费15分钟&#xff0c;第二种有8块&#xff0c;需要花费20分钟&#xff0c;第三问有10块&#xff0c;需要花费25分钟。 现在要吃x块披萨&#xff0c;问最少时间花…