1,2,2,3,3,4,4,4,......

题目描述:

有一个数列A={1,2,2,3,3,4,4,4,……}。数字i有A[i]个。

设F[i]表示数字i最后一次出现的位置。G[i]表示数字F[i]最后一次出现的位置,即G[i]=F[F[i]]。求G[i]。(i<=1e9),答案模1e9+7。有多组数据。

解题正确性证明:

根据定义F[i]=A[1]+A[2]+A[3]+……+A[i]。由此我们可以很方便地求出F[i]。我们甚至可以由G[i]=F[F[i]]求出G[i]。但是题目的i很大,F[i]更大,直接求G[i]不可能。

再推导G[i]-G[i-1]=A[1]+A[2]+A[3]+……+A[F[i]]-(A[I]+A[2]+A[3]+……+A[F[i-1]])

=A[F[i-1]+1]+A[F[i-1]+2]+……+A[F[i]]。

因为F[i-1]是i-1最后一次出现的位置所以A[F[i-1]+1]=A[F[i-1]+2]=A[F[i-1]+3]=……=A[F[i]]=i。

又因为F[i-1]+1到F[i]的个数是A[i]。

所以G[i]-G[i-1]=i*A[i]。

所以G[i]=1*A[1]+2*A[2]+3*A[3]+……+i*A[i]。

因为A[i]在某一段是连续的,确切地说A[F[A[i]-1]+1]=A[F[A[i]-1]+2]=A[F[A[i]-1]+3]=……=A[F[A[i]]=A[i]。

G[i]=F[1]*1+(F[1]+1)*2+F[2]*2+(F[2]+1)*3+F[3]*3+……

+(F[A[i]-1]+1)*A[F[A[i]]+(F[A[i]-1]+2)*A[F[A[i]]+……+i*A[F[A[i]]。

又因为{F[A[i]-1]+1,F[A[i]-1]+2,F[A[i]-1]+3,……,F[A[i]]}为等差数列。

所以G[i]=(F[0]+F[1]+1)*A[1]/2*1+(F[1]+F[2]+1)*A[2]/2*2+(F[2]+F[3]+1)*A[3]/2*3+……

+(F[A[i]-1]+i+1)*(i-F[A[i]-1])/2*A[F[A[i]]]。为了形式上的统一,这里假定F[0]=0。

这个等式中我们最多只用到了F[A[i]],当i很大时,A[i]远小于i,所以我们可以通过这个等式求出G[i]。

特别地,当i=F[A[i]]时,最后一段求和恰好也完整,此时有

G[i]=(F[0]+F[1]+1)/2*1+(F[1]+F[2]+1)*A[2]/2*2+(F[2]+F[3]+1)/2*3+……

+(F[A[i]-1]+F[A[i]]+1)*A[A[i]]/2*A[i]。因为有多组数据,所以我们先预处理出所有G[F[j]],1<=j<=A[i]。

原文地址:https://www.cnblogs.com/JebediahKerman/p/6020681.html