题目描述:
有一个数列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]。