两个比较好的资料:
oiwiki
原课件
oiwiki上讲得十分细致,而原课件上还讲了扩展。
最基本的问题是求 f(n,a,b,c)=i=1∑n⌊cai+b⌋
这里注意其他的地方好多写的是 f(n,a,b,c)=i=0∑n⌊cai+b⌋,而我认为从 1 开始的更加自然,后面细节就比较少了。
主要思想是把下取整的式子拆成 ∑1 的形式,然后交换求和号,把判断的式子转化一下,这样 a,c 的地位就交换了,于是就成为一个欧几里得的形式(因为我们可以 (a,c)→(a%c,c)→(c,a%c))。
其实这种思路在具体数学中求 i=1∑n⌊i⌋ 的封闭形式时就用到了。当时觉得很妙,平常貌似没有这样化过求和式子。然而这种思路在OI中果然还是有用武之地的。
还有一个很诡异的事就是具体数学中提到的 i=0∑c−1cai+b=i=0∑a−1aci+b:互反率,但是这个一点都不显然,根本不知道为什么啊QAQ,书中也只是推导出它的封闭形式之后发现 a 与 c 处于同等地位...也没有具体解释为什么会这样QAQ
upd:
啊我菜死了不动脑子
其实这玩意挺好理解的啊..我们先把下取整去掉看看,发现它们分别等于是 2a(c−1)+b,fracc(a−1)2+b,然后加上下取整之后前一个式子它们大概会分别减去 c2c(c−1),a2a(a−1)。。这里是感性理解,具体证明只要 a,c 除掉gcd之后就满足遍历完全剩余系,就得证了。。
主要还得再提一下扩展的问题:
求 f(n,a,b,c,u,v)=i=1∑niu⌊cai+b⌋v
可以发现oiwiki后面讲的扩展就是当 u,v 为小常数时的情况,而它们是相互递归的。原课件里直接讲了这个更一般的形式。
f(n,a,b,c,u,v)=i=1∑niuj≥1∑[⌊cai+b⌋≥j](jv−(j−1)v)
然后因为 (j+1)v−jv 是一个 v−1 次多项式,所以这个问题也可以类似地缩小规模,具体推导直接看原课件咯
还有一些应用,看dh博客
啊这,但是dh博客里好像有挺多错误的啊...自己写一下咯
f(n,a,b,c)=i=1∑n⌊cai+b⌋
f(n,a,b,c)=f(n,amodc,bmodc,c)+2n(n+1)⌊ca⌋+n⌊cb⌋
设 m=⌊can+b⌋
f(n,a,b,c)=i=1∑nj=1∑m[⌊cai+b⌋≥j]=i=1∑nj=1∑m[ai>cj−b−1]=j=1∑mi=1∑n[i>⌊acj−b−1⌋]=nm−f(m,c,−b−1,a)
里面运用了一些取整的性质。。如当 n 为整数,x 为实数时
x<n⇔⌊x⌋<n,x≥n⇔⌊x⌋≥n,x>n⇔⌈x⌉>n,x≤n⇔⌈x⌉≤n
还要注意上面的推导变成 ai>cj−b−1 的那一步其实是利用了两边都是整数,把 ≥ 变成了 >。于是这个式子只在 a,b,c 都是整数时适用。在它们都是有理数时可以上下同乘一个数化为整数。
而在无理数时就有点棘手。这时有可能会满足 ai≥cj−b 这个式子永远不会取等。这时就可以直接变成 >,也就是最后结果是向 f(m,c,−b,a) 递归。比如【清华集训2014】Sum这题就是这样。然而如果不满足永远不会取等的话,就有点麻烦了,我好像不会诶..(比如 a=2,b=−52)
啊,还要注意的是如果存浮点数的话精度会爆炸,需要姿势正确一点..比如如果只含有 2 的话可以表示成 a2+b
求 axmodp<c(x∈[0,n]) 的数量..
i=0∑n[ai−⌊pai⌋p<c]=i=0∑n[⌊pai−c⌋<⌊pai⌋]
然后因为它们最多相差 1,所以直接变成 f(n,a,p,p)−f(n,a,p−c,p)(加上 p 变成正数感觉比较好)