没写完,以后还会更()
引入
给定 a,b,c,n,计算下面表达式的值:
(i=0∑n⌊cai+b⌋)mod998244353
类欧几里得算法
考虑下面的恒等式:
⌊cai+b⌋=⌊c(⌊ca⌋c+amodc)i+(⌊cb⌋c+bmodc)⌋
于是我们有:
===i=0∑n⌊cai+b⌋i=0∑n⌊c(⌊ca⌋c+amodc)i+(⌊cb⌋c+bmodc)⌋i=0∑n⌊c(amodc)i+bmodc⌋+i=0∑ni⌊ca⌋+i=0∑n⌊cb⌋i=0∑n⌊c(amodc)i+bmodc⌋+2n(n+1)⌊ca⌋+(n+1)⌊cb⌋
记 f(a,b,c,n)=i=0∑n⌊cai+b⌋,则有:
f(a,b,c,n)=f(amodc,bmodc,c,n)+2n(n+1)⌊ca⌋+(n+1)⌊cb⌋
于是问题被转化为了 a,b<c 的情况。此时考虑再做一个转化:
i=0∑n⌊cai+b⌋=i=0∑nj=0∑⌊can+b⌋−1[j<⌊cai+b⌋]
然后又有:
===[j<⌊cai+b⌋][j+1<cai+b+1][acj+c−b−1<i][⌊acj+c−b−1⌋<i]
记 m=⌊can+b⌋,则有原式为:
====== =f(a,b,c,n)i=0∑n⌊cai+b⌋i=0∑nj=0∑m−1[j<⌊cai+b⌋]i=0∑nj=0∑m−1[⌊acj+c−b−1⌋<i]j=0∑m−1i=0∑n[i>⌊acj+c−b−1⌋]j=0∑m−1(n−⌊acj+c−b−1⌋)j=0∑m−1n−j=0∑m−1⌊acj+c−b−1⌋nm−f(c,c−b−1,a,m−1)
不断重复执行上面的两个操作直到 a=0 的边界情况为止,可以利用类似于欧几里得算法 / 扩展欧几里得算法的时间复杂度分析,证明其时间复杂度为 O(logmin(a,c))。
练习
Problem 1
给定 a,b,c,n,计算下面表达式的值:
(i=0∑ni⌊cai+b⌋)mod998244353
Sol 1
和前面的推导过程很相似。首先把问题转化为 a,b<c 的情况:
=====g(a,b,c,n)i=0∑ni⌊cai+b⌋i=0∑n(i⌊c(amodc)i+bmodc⌋+i2⌊ca⌋+i⌊cb⌋)i=0∑ni⌊c(amodc)i+bmodc⌋+i=0∑ni2⌊ca⌋+i=0∑ni⌊cb⌋i=0∑ni⌊c(amodc)i+bmodc⌋+6n(n+1)(2n+1)⌊ca⌋+2n(n+1)⌊cb⌋g(amodc,bmodc,c,n)+6n(n+1)(2n+1)⌊ca⌋+2n(n+1)⌊cb⌋
然后只考虑 a,b<c 的情况(同样的,还是记 m=⌊can+b⌋):
==========g(a,b,c,n)i=0∑ni⌊cai+b⌋i=0∑nij=0∑m−1[j<⌊cai+b⌋]i=0∑nij=0∑m−1[i>⌊acj+c−b−1⌋]j=0∑m−1i=0∑ni[i>⌊acj+c−b−1⌋]j=0∑m−1i=⌊acj+c−b−1⌋+1∑nij=0∑m−121(n+⌊acj+c−b−1⌋+1)(n−⌊acj+c−b−1⌋)j=0∑m−121(n2−⌊acj+c−b−1⌋2+n−⌊acj+c−b−1⌋)j=0∑m−121n(n+1)−j=0∑m−121⌊acj+c−b−1⌋2−j=0∑m−121⌊acj+c−b−1⌋21nm(n+1)−21j=0∑m−1⌊acj+c−b−1⌋2−21j=0∑m−1⌊acj+c−b−1⌋21nm(n+1)−21h(c,c−b−1,a,m−1)−21f(c,c−b−1,a,m−1)
其中
h(a,b,c,n)=i=0∑n⌊cai+b⌋2
现在的问题就是计算 h(a,b,c,n) 的值。同样考虑类欧,先转化为 a,b<c 的情况:
=====h(a,b,c,n)i=0∑n⌊cai+b⌋2i=0∑n⌊c(⌊ca⌋c+amodc)i+(⌊cb⌋c+bmodc)⌋2(i=0∑n⌊ca⌋i+i=0∑n⌊cb⌋+⌊c(amodc)i+bmodc⌋)2⌊ca⌋2i=0∑ni2+2⌊ca⌋⌊cb⌋i=0∑ni+⌊cb⌋2(n+1)+2⌊ca⌋i=0∑ni⌊c(amodc)i+bmodc⌋+2⌊cb⌋i=0∑n⌊c(amodc)i+bmodc⌋+i=0∑n⌊c(amodc)i+bmodc⌋2⌊ca⌋26n(n+1)(2n+1)+2⌊ca⌋⌊cb⌋2n(n+1)+⌊cb⌋2(n+1)+2⌊ca⌋i=0∑ni⌊c(amodc)i+(bmodc)⌋+2⌊cb⌋i=0∑n⌊c(amodc)i+bmodc⌋+h(amodc,bmodc,c,n)
然后同样的只考虑 a,b<c 的情况(同样的,还是记 m=⌊can+b⌋):
========h(a,b,c,n)i=0∑n⌊cai+b⌋2i=0∑nj=0∑m−1[j<⌊cai+b⌋](2j+1)i=0∑nj=0∑m−1[i>⌊acj+c−b−1⌋](2j+1)j=0∑m−1(2j+1)i=0∑n[i>⌊acj+c−b−1⌋]j=0∑m−1(2j+1)(n−⌊acj+c−b−1⌋)j=0∑m−12jn+j=0∑m−1n−j=0∑m−12j⌊acj+c−b−1⌋−j=0∑m−1⌊acj+c−b−1⌋nm2−2j=0∑m−1⌊acj+c−b−1⌋−j=0∑m−1⌊acj+c−b−1⌋nm2−2g(c,c−b−1,a,m−1)−f(c,c−b−1,a,m−1)
此时可以在 g,h 两个函数之间轮换递归处理计算答案,注意到递归到不同函数的参数都是相同的,所以总时间复杂度仍然为 O(logmin(a,c))。
Problem 2
给定 a,b,c,求不等式 ax+by≤c 的非负整数解 (x,y) 的对数。
Sol 2
直接对 ax+by≤c 搞事情的话需要同时处理 x,y 两个维度上的问题,因此考虑移项再处理,得到 0≤y≤⌊bc−ax⌋,即对于一个固定的 x,y 的取值范围是 [0,⌊bc−ax⌋]∩N+。
于是该不等式的解的数量即为:
i=0∑⌊ac⌋⌊bc−ai⌋+⌊ac⌋+1
于是实际上要求的核心部分就是:
i=0∑⌊ac⌋⌊b−ai+c⌋
但是这个东西前面的系数是负的,直接搞会比较的难受。考虑做一个小小的转化:
==i=0∑n⌊b−ai+c⌋i=0∑n⌊−bai−c⌋−i=0∑n⌊bai+(b−c−1)⌋
这个式子就是最基本的类欧形式,直接套公式即可 O(logmin(a,b,c)) 求解。
Problem 3
给定 n,r,求 d=1∑n(−1)⌊dr⌋ 的值。
Sol 3
先考虑一个经典结论:
(−1)x=1−2[xmod2=1]
然后考虑从这个结论入手来获取一些有用的信息:
===(−1)x1−2[xmod2=1]1−2(x−2⌊2x⌋)1−2x+4⌊2x⌋
然后考虑把这个东西带入原式:
===d=1∑n(−1)⌊dr⌋d=1∑n(1−2⌊dr⌋+4⌊2⌊dr⌋⌋)(d=1∑n1)−(d=1∑n2⌊dr⌋)+(d=1∑n4⌊2⌊dr⌋⌋)n−(d=1∑n2⌊dr⌋)+(d=1∑n4⌊2dr⌋)
考虑换元,令 x=r,则此时考虑构造函数 γ(a,b,c,n)=i=1∑n⌊cax+b×i⌋,那么上式的答案可以表示为 n−2γ(1,0,1,n)+4γ(1,0,2,n)。因此只需要用类欧把 γ 函数给表示出来即可。
这里注意到 cax+b 的值是一个定值,因此容易想到对其值进行分类讨论:
1. cax+b=1
此时有 γ(a,b,c,n)=i=1∑n1=n。
2. cax+b>1
记 t=cax+b,T=⌊t⌋,则考虑构造类欧形式:
=====γ(a,b,c,n)i=1∑n⌊ti⌋i=1∑n⌊ti−Ti+Ti⌋i=1∑n⌊ti−Ti⌋+i=1∑nTii=1∑n⌊(cax+b−T)i⌋+2n(n+1)Tγ(a,b−cT,c,n)+2n(n+1)T
3. cax+b<1
此时有 T=0,无法继续使用上面的递归公式递归处理答案,因此考虑换一个方法。
===========γ(a,b,c,n)i=1∑n⌊ti⌋i=1∑nj=1∑⌊nt⌋[j<ti]i=1∑nj=1∑⌊nt⌋[i>tj]j=1∑⌊nt⌋i=1∑n[i>tj]j=1∑⌊nt⌋(n−⌊tj⌋)j=1∑⌊nt⌋(n−⌊cax+bj⌋)j=1∑⌊nt⌋(n−⌊ax+bjc⌋)n⌊nt⌋−j=1∑⌊nt⌋⌊ax+bcj⌋n⌊nt⌋−j=1∑⌊nt⌋⌊a2x2−b2c(ax−b)j⌋n⌊nt⌋−j=1∑⌊nt⌋⌊a2r−b2cax−cbj⌋n⌊nt⌋−γ(ca,−cb,a2r−b2,⌊nt⌋)
同样也得到了递归公式。简单分析可知该算法时间复杂度同样为 O(logn) 级别,可以通过该题。
corner case
需要特殊处理 r∈N 的情况。
有帮助,赞一个