- 求 F(a,b,c,n)=i=0∑n⌊cai+b⌋
- 求 G(a,b,c,n)=i=0∑n⌊cai+b⌋2
- 求 H(a,b,c,n)=i=0∑ni⌊cai+b⌋
答案对
998244353 取模。
第一问
分类讨论。
(a≥c)∨(b≥c)
众所周知
⌊ca⌋⟺⌊c⌊ca⌋c+(amodc)⌋
所以我们有
=====F(a,b,c,n)i=0∑n⌊cai+b⌋i=0∑n(⌊c⌊ca⌋c+(amodc))i+(⌊cb⌋c+(bmodc))⌋)i=0∑n(⌊c(amodc)i+(bmodc)⌋+i⌊ca⌋+⌊cb⌋)i=0∑n⌊c(amodc)i+(bmodc)⌋+i=0∑ni⌊ca⌋+i=0∑n⌊cb⌋F(amodc,bmodc,c,n)+2n(n+1)⌊ca⌋+(n+1)⌊cb⌋
(a<c)∧(b<c)
我们需要知道两个前置芝士:
- n=i=0∑n−11
- [x] 被称为“艾弗森括号”,当 x 为真时它为 1,否则为 0。根据定义有 i=0∑n[i>x]=n−x
知道了这个,我们来化简原式。
F(a,b,c,n)=∑i=0n⌊cai+b⌋=∑i=0n∑j=0⌊cai+b⌋−11
对于两层
∑,我们可以调换顺序,只是需要稍微修改一下,变为
∑j=0⌊can+b⌋−1∑i=0n[j<⌊cai+b⌋]
接下来我们化简艾弗森括号中的内容。
⇒⇒⇒⇒⇒j<⌊cai+b⌋j+1≤⌊cai+b⌋j+1≤cai+bj+c+c−b≤aijc+c−b−1<aii>⌊ajc+c−b−1⌋
我们“承上启下”,把它套回去
∑j=0⌊can+b⌋−1(n−⌊ajc+c−b−1⌋)
令
m=⌊can+b⌋
那么我们有
===F(a,b,c,n)i=0∑m−1(n−⌊aci+(c−b−1)⌋)i=0∑m−1n−i=0∑m−1⌊aci+(c−b−1)⌋nm−F(c,c−b−1,a,m−1)
边界情况
a 是分母,所以需要讨论
a=0 的情况。
==F(0,b,c,n)i=0∑n⌊cb⌋(n+1)⌊cb⌋
还有一种边界情况,当
n=0 时,
F(a,b,c,0) 显然为
⌊cb⌋。
总结
把上面的内容结合起来,就能得出最终式子了。
F(a,b,c,n)=⎩⎨⎧(n+1)⌊cb⌋⌊cb⌋F(amodc,bmodc,c,n)+2n(n+1)⌊ca⌋+(n+1)⌊cb⌋nm−F(c,c−b−1,a,m−1)a=0n=0(a≥c)∨(b≥c)(a<c)∧(b<c)
第二问
还是分类讨论。
(a≥c)∨(b≥c)
===G(a,b,c,n)i=0∑n⌊cai+b⌋2i=0∑n⌊c(⌊ca⌋c+(amodc))i+⌊cb⌋c+(bmodc)⌋2i=0∑n⌊⌊ca⌋i+⌊cb⌋+c(amodc)i+(bmodc)⌋2
依旧需要一些前置芝士:
(a+b+c)2=a2+b2+c2+2ab+2bc+2ca
令
t=⌊camodc×i+bmodc⌋,式子就变成了:
=i=0∑n(⌊ca⌋2i2+⌊cb⌋2+t2+2⌊ca⌋⌊cb⌋i+2⌊ca⌋it+2⌊cb⌋t)i=0∑n⌊ca⌋2i2+i=0∑n⌊cb⌋2+i=0∑nt2+i=0∑n2⌊ca⌋⌊cb⌋i+i=0∑n2⌊ca⌋it+i=0∑n2⌊cb⌋t
这个式子只是项数多,整理一下得到
G(a,b,c,n)=G(amodc,bmodc,c,n)+2⌊ca⌋H(amodc,bmodc,c,n)+2⌊cb⌋F(amodc,bmodc,c,n)+(n+1)⌊cb⌋2+⌊ca⌋26n(n+1)(2n+1)+⌊ca⌋⌊cb⌋n(n+1)
所以,它会调用另外的两个函数,并且会一直递归。
(a<c)∧(b<c)
如果我们像之前一样换枚举,很难对付平方。可以用一种十分巧妙的方法来绕过它:
===n2(n2+n)−n2×2n(n+1)−n(2i=1∑ni)−n
这样问题就简单很多了。
==G(a,b,c,n)i=0∑n2j=1∑⌊cai+b⌋j−⌊cai+b⌋2i=0∑nj=0∑⌊cai+b⌋−1(j+1)−F(a,b,c,n)
对于前一项,依旧用老方法换枚举。这样左边就是
2j=0∑m−1(j+1)i=0∑n[j<⌊cai+b⌋]
不等式变换和上面一样。
===2j=0∑m−1(j+1)i=0∑n[i>⌊ajc+c−b−1⌋]2j=0∑m−1(j+1)(n−⌊ajc+c−b−1⌋)2i=0∑m−1(ni+n−i⌊aci+c−b−1⌋−⌊aci−c−b−1⌋)nm(m+1)−2H(c,c−b−1,a,m−1)−2F(c,c−b−1,a,m−1)
边界情况
很显然,如果
a=0,那结果就是
(n+1)⌊cb⌋2。如果
n=0,那就是
⌊cb⌋2。
总结
G(a,b,c,n)=⎩⎨⎧(n+1)⌊cb⌋2⌊cb⌋2nm(m+1)−2H(c,c−b−1,a,m−1)−2F(c,c−b−1,a,m−1)−F(a,b,c,n)G(amodc,bmodc,c,n)+2⌊ca⌋H(amodc,bmodc,c,n)+2⌊cb⌋F(amodc,bmodc,c,n)+(n+1)⌊cb⌋2+⌊ca⌋26n(n+1)(2n+1)+⌊ca⌋⌊cb⌋n(n+1)a=0n=0a<c∧b<ca≥c∨b≥c
第三问
依旧分类讨论。
(a≥c)∨(b≥c)
与之前类似,还是一样的操作。
====H(a,b,c,n)=i=0∑nicai+bi=0∑ni[c(amodc+⌊ca⌋c)i+(bmodc+⌊cb⌋c)]i=0∑nic(amodc)i+(bmodc)+ica+cbi=0∑nic(amodc)i+(bmodc)+i=0∑ni2⌊ca⌋+i=0∑nicbH(amodc,bmodc,c,n)+6n(n+1)(2n+1)⌊ca⌋+2n(n+1)⌊cb⌋
(a<c)∧(b<c)
====H(a,b,c,n)i=0∑nicai+bi=0∑nij=0∑⌊cai+b∣−11j=0∑m−1i=0∑ni[j<⌊cai+b⌋]j=0∑m−1i=0∑ni[i>[ajc+(c−b−1)]]
不等式的变换也和前面相同。令
t=⌊ajc+c−b−1⌋,那么
=====H(a,b,c,n)j=0∑m−1i=0∑ni[i>t]j=0∑m−1i=t+1∑nij=0∑m−12(n−t)(n+t+1)21j=0∑m−1(n(n+1)−t2−t)21(mn(n+1)−i=0∑m−1t2−i=0∑m−1t)
接着把
t 展开。注意
j 改名了,展开时不要忘记改名。
=21(mn(n+1)−i=0∑m−1⌊aci+c−b−12−i=0∑m−1⌊aci+c−b−1⌋)21(mn(n+1)−G(c,c−b−1,a,m−1)−F(c,c−b−1,a,m−1))
于是我们发现,这个
H 函数又一次调用了前面的函数。
边界情况
边界情况比较好考虑。如果
n=0,原式显然为
0;如果
a=0,原式显然为
2n(n+1)⌊cb⌋。
总结
H(a,b,c,n)=⎩⎨⎧02n(n+1)⌊cb⌋H(amodc,bmodc,c,n)+6n(n+1)(2n+1)⌊ca⌋+2n(n+1)⌊cb⌋21(mn(n+1)−G(c,c−b−1,a,m−1)−F(c,c−b−1,a,m−1))n=0a=0(a≥c)∨(b≥c)(a<c)∧(b<c)
代码
代码的细节比较多,所以仔细说一下。
首先,题目让把答案取模,所以代码中除以
2 和
6 的部分应该乘它们的逆元。