fork download
  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <math.h>
  4. #include <iostream>
  5. #include <vector>
  6. #include <limits>
  7. using namespace std;
  8.  
  9. unsigned long long calcolacifra(long long cifra, long long K, long long E){
  10. cifra--;
  11. long double a =pow(10,cifra);
  12. long double b=a/K;
  13. b=pow(b,1/(long double)E);
  14. return ceil(b)-1;//usando floor(b) mi vengono valori sballati
  15. }
  16. unsigned long long predict(long long K, long long E, long long N) {
  17. N--;//La prima cifra è alla posizione 0
  18. unsigned long long sommaCifre=0;
  19. int cifraCorr=3;
  20. vector<unsigned long long> xConMinimaCifra;
  21.  
  22. unsigned long long rimaste;
  23. unsigned long long pos;
  24.  
  25. xConMinimaCifra.push_back(calcolacifra(1,K,E));
  26. xConMinimaCifra.push_back(calcolacifra(2,K,E));
  27.  
  28. sommaCifre+=xConMinimaCifra[1]-xConMinimaCifra[0];
  29.  
  30. while(sommaCifre<N){
  31. xConMinimaCifra.push_back(calcolacifra(cifraCorr,K,E));
  32. sommaCifre+=(cifraCorr-1) *(xConMinimaCifra[cifraCorr-1]-xConMinimaCifra[cifraCorr-2]);
  33. cifraCorr++;
  34. }
  35. //Ora ho superato N, devo "tornare indietro"
  36. cifraCorr--;
  37. sommaCifre-=(cifraCorr-1) *(xConMinimaCifra[cifraCorr-1]-xConMinimaCifra[cifraCorr-2]);
  38.  
  39. rimaste = N-sommaCifre;//Numero di cifre rimaste
  40.  
  41. pos = rimaste/(cifraCorr-1)+1;
  42. pos+=xConMinimaCifra[cifraCorr-2];
  43.  
  44. return pos;
  45. }
  46.  
  47. int main() {
  48. FILE *fr, *fw;
  49. long long K, E, N;
  50. fr = stdin;
  51. fw = stdout;
  52. assert(3 == fscanf(fr, "%lld %lld %lld", &K, &E, &N));
  53. fprintf(fw, "%lld\n", predict(K, E, N));
  54. fclose(fr);
  55. fclose(fw);
  56. return 0;
  57. }
Success #stdin #stdout 0s 15240KB
stdin
1 3 29
stdout
12