fork download
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include<cmath>
  4. using namespace std;
  5. int m, n, max_q; // длина и ширина таблицы, максимальное количество чисел в строке
  6.  
  7. int element(int i) // формула для i-того элемента последовательности
  8. {
  9. i++;
  10. return i*i+4*(i*i-i);
  11. }
  12. int length_of_element(int el) // длина i-того элемента
  13. {
  14. if( el==0|| el==1 )
  15. return 1;
  16. return ceil(log10(el));
  17. }
  18.  
  19. int max_quantity() // максимальное количество чисел в строке
  20. {
  21. int max_q=0;
  22. int length=0;
  23. for(int j=0; true; j++)
  24. {
  25. int elem = element(j);
  26. int length_el = length_of_element(elem);
  27. if(length + length_el <= n) // проверяем, "поместится" ли в строку очередное число
  28. {
  29. length += length_el;
  30. max_q++;
  31. if(length == n)
  32. return max_q;
  33. }
  34. else // если число не "влезает", добавляем "+"
  35. {
  36. max_q++;
  37. return max_q;
  38. }
  39. if(length+1 <= n) // если число "поместилось", но осталось место еще для одного символа, тоже добавляем "+"
  40. {
  41. length += 1;
  42. if(length == n)
  43. return max_q;
  44. }
  45. }
  46. return max_q; // такая ситуация невозможна
  47. }
  48.  
  49. int line(int i) // печать i-той строки
  50. {
  51. int length=0;
  52. for(int jj=i; true; jj++)
  53. {
  54. int j = jj % max_q; // формула циклического сдвига чисел в строке
  55. int elem = element(j); // число которое мы будем выводить
  56. int length_el = length_of_element(elem); // длина числа
  57. if(length + length_el <= n) // если полученная нами длина все еще меньше заданного количества столбцов, мы выводим число
  58. {
  59. length += length_el;
  60. cout << elem;
  61. if(length == n)
  62. {
  63. cout << endl;
  64. return length;
  65. }
  66. }
  67. else // если длина получается больше, мы "отрезаем" от числа нужное количество символов
  68. {
  69. int excess = length+length_el-n;
  70. for(int z = 0; z < excess; ++z) elem /= 10;
  71. cout << elem << endl;
  72. return length;
  73. }
  74.  
  75. if(length + 1 <= n) // проверяем, нужно ли выводить "+"
  76. {
  77. length += 1; cout << "+";
  78. if(length == n)
  79. {
  80. cout << endl;
  81. return length;
  82. }
  83. }
  84. }
  85. return 0;
  86. }
  87.  
  88. int main()
  89. {
  90. cin >> m >> n; // параметры таблицы
  91. max_q = max_quantity(); // вычисляем максимально возможное количество чисел в строке
  92. for(int i=0; i<m; i++) line(i); // вывод таблицы
  93. return 0;
  94. }
  95.  
Success #stdin #stdout 0s 3416KB
stdin
12 13
stdout
1+12+33+64+10
12+33+64+105+
33+64+105+1+1
64+105+1+12+3
105+1+12+33+6
1+12+33+64+10
12+33+64+105+
33+64+105+1+1
64+105+1+12+3
105+1+12+33+6
1+12+33+64+10
12+33+64+105+