zoukankan      html  css  js  c++  java
  • 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]。

  • 相关阅读:
    python smtplib email
    python merry -- error handling in the real world
    python os.path
    python logging
    Python演讲笔记1
    python DBUtils.PooledDB 中 maxcached 和 maxconnections
    Effective Python2 读书笔记3
    Effective Python2 读书笔记2
    MVC验证session是否过期,在每个action执行之前验证
    int类型的正负数转换
  • 原文地址:https://www.cnblogs.com/JebediahKerman/p/6020681.html
Copyright © 2011-2022 走看看