B3856 [语言月赛 202309] 椰奶国 题解
cff_0102
·
·
题解
题解区怎么没有纯数学解法。
这道题,可以先分别计算出起始时刻和结束时刻是一天当中的第几秒,然后再作差,就能直接得到答案。
已知有一个时刻是 (a+1):(b+1):(c+1),怎么计算出它是一天中的第几秒呢?
首先,把这个时刻拆成 (a+1) 个小时,(b+1) 分钟和 (c+1) 秒。
由题意得,某一小时的第 b 分钟共有 10b+1 秒,则某一小时从第 0 分钟到第 b 分钟(共 b+1 分钟)就一共过去了 (10\times0+1)+(10\times1+1)+(10\times2+1)+\dots+(10b+1) 秒。根据等差数列求和公式,这个算式的结果是 \dfrac{(10\times0+1+10b+1)\times(b+1)}{2}=5b^2+6b+1。
由题意得,一天中的第 a 小时共有 a+1 分钟(从第 0 分钟到第 a 分钟),根据上面的计算,则这一小时共有 5a^2+6a+1 秒。从第 0 个小时到第 a 个小时(共 a+1 个小时)就一共过去了 (5\times0^2+6\times0+1)+(5\times1^2+6\times1+1)+\dots+(5a^2+6a+1) 秒。把它们拆开,变成 5\times(0^2+1^2+\dots+a^2)+6\times(0+1+\dots+a)+(1+1+\dots+1),分别代入平方和公式、等差数列求和公式和项数 a,得到原式等于 \dfrac{5a(a+1)(2a+1)}{6}+3a(a+1)+(a+1)=\dfrac{10a^3+33a^2+29a+6}{6}。
然后把它们相加,设 f(a+1,b+1,c+1) 表示 (a+1):(b+1):(c+1) 是一天中的第几秒:
f(a,b,c)=\dfrac{10(a-1)^3+33a^2+29a+6}{6}+5b^2+6b+c+2
则此题的答案为:f(E-1,F-1,G-1)-f(A-1,B-1,C-1)。
如果这个数为负数,就说明这个时间范围跨了一天。所以输出答案的时候还需要先将其加上一天的秒数,再取模,得到一个范围在 0 和一天秒数之间的数,那就是答案。
def f(a,b,c):
return (10*a*a*a+33*a*a+29*a+6)//6+5*b*b+6*b+c+2
t=int(input())
while t:
t-=1
n,A,B,C,E,F,G=input().split()
n,A,B,C,E,F,G=(int(n),int(A),int(B),int(C),int(E),int(F),int(G))
tmp=f(n-1,0-1,0-1)
print((f(E-1,F-1,G-1)-f(A-1,B-1,C-1)+tmp)%tmp)