zoukankan      html  css  js  c++  java
  • 【二分】CF Round #587 (Div. 3)E2 Numerical Sequence (hard version)

    题目大意

    有一个无限长的数字序列,其组成为1 1 2 1 2 3 1.......1 2 ... n...,即重复的1~1,1~2....1~n,给你一个(k),求第(k(k<=10^{18}))个数字是什么。

    思路

    (a[i])为该数到达(i)的长度,(b[i])为第(i)个数那一块的长度,(sum b[i]=a[i]),发现([10^i,10^{i+1}))的数长度均为(i+1),那么在这一段中(b[i])都是一个等差数列,而计算(a[i])就可以分为两块计算,在(10^i)之前前面应该就可以处理出来,考虑(10^i)之后的情况,设(l=b[10^{i−1}],cnt=x−10i+1),所以(b[x]=b[10^{i−1}]+l×cnt+cnt×(cnt+1)/2×(i+1))
    然后就好做了,两次二分就好了,第一次二分找到最大的i使(b[i]<k),那么解就在第(i+1)块中,(k−=ssum[i]);第二次二分找到最大的(i)使(sum[i]<k),那么解就在数(i+1)中,(k−=sum[i])。最后数(i+1)的第(k)位就是答案。

    代码

    等会放 我好难
    
  • 相关阅读:
    *args和**kwargs
    事件驱动模型
    同步异步和阻塞非阻塞
    多进程和多线程
    认识tornado(五)
    认识tornado(四)
    认识tornado(三)
    [GO]使用select实现超时
    [GO]使用select实现斐波那契
    [GO]ticker的使用
  • 原文地址:https://www.cnblogs.com/Midoria7/p/12795885.html
Copyright © 2011-2022 走看看