fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. char Cset[5] = {'h','k','m','r','t'};
  5. char Vset[3] = {'a','o','u'};
  6.  
  7. long long countL(int L) {
  8. int c = (L + 1) / 2; // кількість приголосних
  9. int v = L / 2; // кількість голосних
  10. long long r = 1;
  11. while (c--) r *= 5;
  12. while (v--) r *= 3;
  13. return r;
  14. }
  15.  
  16. int main() {
  17. long long N;
  18. scanf("%lld", &N);
  19.  
  20. // 1. Знайти довжину слова L
  21. long long S = 0, prevS = 0;
  22. int L = 0;
  23. while (S < N) {
  24. L++;
  25. prevS = S;
  26. S += countL(L);
  27. }
  28.  
  29. // 2. Індекс усередині слів довжини L
  30. long long idx = N - prevS - 1;
  31.  
  32. // 3. Обчислення слова
  33. char word[100];
  34. long long p;
  35. for (int i = 1; i <= L; i++) {
  36. // база для позиції i
  37. int r = (i % 2 ? 5 : 3);
  38.  
  39. // вага розряду p_i
  40. p = 1;
  41. for (int j = i + 1; j <= L; j++)
  42. p *= (j % 2 ? 5 : 3);
  43.  
  44. int d = idx / p;
  45. idx %= p;
  46.  
  47. word[i-1] = (i % 2 ? Cset[d] : Vset[d]);
  48. }
  49. word[L] = '\0';
  50.  
  51. printf("%s\n", word);
  52. return 0;
  53. }
  54.  
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout