La maravillosa secuencia de T4 Cuckoo East

tema

límite de tiempo

1 s

Limitaciones de espacio

64 MB

Descripción del Título

Gu Gu Dong está trabajando en funciones terriblemente complejas, pero para Gu Gu Dong, quien tiene A Plus firmemente, hace tiempo que dejó de asistir a clases.

En ese momento, de repente pensó en una extraña secuencia infinita mientras dormía: 112123123412345 ...

Esta secuencia consta de varias partes que constan de números enteros positivos consecutivos. La primera parte contiene todos los números entre 1 y 1, la segunda parte contiene todos los números entre 1 y 2 y la tercera parte contiene todos los números entre 1 y 3. , La parte i-ésima siempre contiene todos los números entre 1 e i.

Entonces, los primeros 56 elementos de esta secuencia serán 11212312341234512345612345671234567812345678912345678910, donde el primer elemento es 1, el tercer elemento es 2, el vigésimo elemento es 5, el 38 ° elemento es 2 y el 56 ° elemento es 0.

¡Gu Gu Dong ahora quiere saber el número k-ésimo! Pero después de que se despertó, descubrió que lo que dijo la maestra ya no era comprensible, por lo que le dejó esta tarea a usted.

Formato de entrada

La entrada consta de varias líneas.

Un número entero q en la primera línea indica que hay q grupos de consultas (1 <= q <= 500)

La siguiente línea i + 1th significa la i-ésima entrada ki, lo que significa pedir el ki-ésimo número. (1 <= ki <= 1018)

Formato de salida

La salida contiene q líneas

La línea i-ésima genera el resultado de salida de la consulta ki.

Entrada de muestra

5
1
3
20
38
56

Salida de muestra

1
2
5
2
0

punto de datos

Inserte la descripción de la imagen aquí

práctica

1. Suma [x] representa la posición en la que x aparece por primera vez en la secuencia y una [x] representa el número de dígitos desde 1 hasta x.
2. Para cada posición de entrada k, use la dicotomía para encontrar el primer mid con suma [mid]> = k, y mid es la suma de los antecedentes donde se encuentra k.
3. Sea k = k-weizhi (mid-1,0), encuentre el primer mid donde a [mid]> k es el número donde k es.
4. Sea k = k-weizhi (mid-1,1), k es la serie del número donde está, convierta el número mid en una cadena y encuentre la k-ésima posición como el número de salida deseado.
5. En la función para encontrar la posición, suma suma y a se combinan, porque suma requiere a como la longitud de secuencia del nivel superior para resolver.
6. Primero, continúe encontrando la suma y a del orden de pow, cuando x esté en este orden de magnitud, luego encuentre la suma y a del mínimo de este orden de magnitud ax

error

1. Tenga en cuenta que en ambas búsquedas, se encuentra el primer valor que hace que el resultado devuelto sea> k, por lo que cuando weizhi (mid, 0/1)> = k, debe hacer mid = r-1 en lugar de r + 1
2. Al principio, consideré almacenar el término anterior y todos los cálculos en una matriz, y descubrí que se producirían errores RE. Considere que la matriz debería estar fuera de límites. Debido a que el rango de datos es 1e18, no se considera que esté almacenado en una matriz grande. (Pero parece que se puede almacenar en una matriz que aumenta en órdenes de magnitud).
3. to_string es compatible con c ++ 11, no compatible con versiones inferiores

Código

#include<iostream>
#include<string>
#include<cmath>
#include<cstdio>
using namespace std;
long long weizhi(long long x,int ch)
{
    
    
 long long pow=1,sum=0,a=0,n=0,weishu=0;
 while(true)
 {
    
    
  pow=pow*10;
  weishu=weishu+1;
  if(x>pow-1)
  {
    
    
   n=pow-pow/10;
   sum=sum+a*n+(n+1)*n/2*weishu;
   a=a+n*weishu;
  }
  else
  {
    
    
   n=x-pow/10+1;
   sum=sum+a*n+(n+1)*n/2*weishu;
   a=a+n*weishu;
   break;
  }
 }
 if(ch==0)
  return sum;
 else
  return a;
}
int main()
{
    
    
 long long ans,k;
 long long q,l,r,mid;
 cin>>q;
 for(int i=0;i<q;i++)
 {
    
    
  cin>>k;
  l=0;r=1e9;
  while(l<=r)
  {
    
    
   mid=(l+r)>>1;
   if(weizhi(mid,0)>=k)
   {
    
    
    ans=mid;
    r=mid-1;
   }
   else
    l=mid+1;
  }
  k=k-weizhi(ans-1,0);
  l=0;
  r=ans+1;
  while(l<=r)
  {
    
    
   mid=(l+r)>>1;
   if(weizhi(mid,1)>=k)
   {
    
    
    
    ans=mid;
    r=mid-1;
   }
   else
    l=mid+1;
  }
  k=k-weizhi(ans-1,1);
  string s =to_string(ans);
  printf("%d\n",s[k-1]-'0');  
  } 
 return 0;
 } 

Supongo que te gusta

Origin blog.csdn.net/alicemh/article/details/105389027
Recomendado
Clasificación