egogoboy

Ломоносов отбор 2

Nov 18th, 2022 (edited)
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.37 KB | None | 0 0
  1. /*Сдать решение задачи 2-1011-Прайморадичная с.с.
  2. Полный балл:  1
  3. Имя входного файла: input.txt или стандартный поток ввода
  4. Ограничение времени:  1 с
  5. Ограничение реального времени:   5 с
  6. Ограничение памяти:    512M
  7. Прайморадичная система счисления. 10-11 класс
  8. В задаче рассмотрим прайморадичную систему счисления, в которой будем записывать неотрицательные целые числа. Это смешанная система счисления, в которой основаниями являются праймориалы pi#: 1, 2, 6, 30, 210, 2310, ... , где i = 1, 2, 3, ... . Каждый праймориал является произведением вроде факториала, но множителями в нём являются подряд идущие простые числа: pn# = 1 * 2 * ... * pi * ... * pn, где pi -- i-ое простое число, а p1 = 1 (в нашей нумерации p2 = 2, так как мы начали последовательность pi с 1, не являющейся простым числом). Так праймориал p5# = p1 * p2 * p3 * p4 * p5 = 1 * 2 * 3 * 5 * 7 = 210. Запись числа в прайморадичной системе делится на позиции, разделённые двоеточиями :. Позиции нумеруются справа налево. Самая правая позиция имеет номер 1 и правее неё двоеточие не ставится. Вместо этого снизу приписывается знак #, помечающий, что это прайморадичная запись. На k-ой позиции допускается указывать десятичное число dk, такое что 0 ≤ dk ≤ pk+1-1. На первой справа позиции может быть указан либо 0, либо 1. На второй справа позиции может стоять либо 0, либо 1, либо 2. На третьей справа позиции может быть либо 0, либо 1, либо 2, либо 3, либо 4. И так далее. Допускается наличие незначащих нулей в левых позициях записи числа. Незначащим является любой нуль, находящийся левее первой встреченной при чтении слева направо ненулевой цифры, или, если записано нулевое число, то все нули, кроме самого правого. Чтобы понять, какое число записано, нужно выполнить вычисления:
  9. dn:dn-1:...:di:...:d2:d1#=dn*pn#+dn-1*pn-1#+...+di*pi#+...+d2*p2#+d1*p1#
  10. Например, 6:3:0:1#=6*p4#+3*p3#+0*p2#+1*p1#=6*30+3*6+0*2+1*1=180+18+0+1=19910. То же самое число может быть записано с незначащими нулями: 0:0:6:3:0:1#. Заметим, что значащая позиция прайморадичной записи не содержит незначащих нулей, то есть, записывая dk, не используют излишние нули слева.
  11. Составьте программу, принимающую на вход в первой строке десятичное число N -- положительное натуральное число (1 ≤ N ≤ 4000) -- длину последовательности, а в последующих N строках -- прайморадичные записи чисел Xi без завершающего знака #, 1 ≤ i ≤ N. Известно, что в каждой записи числа Xi не более чем 65 позиций. Программа находит номера тех чисел последовательности, которые равны максимальному из введённых чисел Xi. Программа выводит все найденные номера в порядке возрастания, построчно, т. е. по одному номеру в одной строке.
  12. Формат входных данных
  13. В первой строке содержится десятичное число N — длина последовательности (1 ≤ N ≤ 4000). В следующих N строках содержатся прайморадичные записи чисел Xi без завершающего знака #, 1 ≤ i ≤ N. В каждой такой записи не более чем 65 позиций, разделённых двоеточиями :. В каждой позиции неотрицательное целое десятичное число, допустимое правилами прайморадичной системы.
  14. Формат результата
  15. Выводятся по возрастанию в формате беззнакового десятичного натурального числа номера k всех тех Xk, для которых верно, что Xk=maxi=1 ... NXi. Каждый номер выводится в отдельной строке.
  16. Примеры
  17. Входные данные
  18. 1
  19. 4:0:0:0
  20. Результат работы
  21. 1
  22. Входные данные
  23. 3
  24. 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
  25. 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
  26. 0
  27. Результат работы
  28. 1
  29. 2
  30. 3
  31. Входные данные
  32. 2
  33. 106:102:100:96:88:82:78:72:70:66:60:58:52:46:42:40:36:30:28:22:18:16:12:10:6:4:2:1
  34. 106:102:100:96:88:82:78:71:70:66:60:58:52:46:42:40:36:30:28:22:18:16:12:10:6:4:2:1
  35. Результат работы
  36. 1*/
  37.  
  38.  
  39. #include<iostream>
  40. #include<fstream>
  41. #include<sstream>
  42. #include<vector>
  43. #include<stdint.h>
  44. #include<algorithm>
  45. #include<cmath>
  46. #define all(container) container.begin(), container.end()
  47. #define fors(counter, start, finish) for (int counter = start; counter < finish; ++counter)
  48. #define forb(counter, start, finish) for (int counter = start; counter >= finish; --counter)
  49. #define vec(type) std::vector<type>
  50. #define dvec(type) std::vector<std::vector<type>>
  51. //#define fin std::cin
  52.  
  53. int main() {
  54.     std::ifstream fin("input.txt");
  55.     int n; fin >> n;
  56.     dvec(int) nums(n);
  57.     fors(i, 0, n) {
  58.         std::string s;
  59.         fin >> s;
  60.         std::stringstream ss;
  61.         ss << s;
  62.         int num; char c; bool null = true;
  63.         while (ss >> num) {
  64.             ss >> c;
  65.             if (num != 0)
  66.                 null = false;
  67.             nums[i].push_back(num);
  68.         }
  69.         if (null) {
  70.             nums[i] = { 0 };
  71.         }
  72.     }
  73.     int ans = 0; dvec(int) group(n);
  74.     group[0].push_back(0);
  75.     fors(i, 1, nums.size()) {
  76.         group[i].push_back(i);
  77.         if (nums[ans].size() == nums[i].size()) {
  78.             int res = ans; bool f = true;
  79.             forb(j, nums[ans].size() - 1, 0) {
  80.                 if (nums[i][j] > nums[ans][j]) {
  81.                     res = i;
  82.                     f = false;
  83.                 }
  84.                 else if (nums[i][j] < nums[ans][j]) {
  85.                     res = ans;
  86.                     f = false;
  87.                 }
  88.             }
  89.             ans = res;
  90.             if (f)
  91.                 group[ans].push_back(i);
  92.         }
  93.         else if (nums[ans].size() < nums[i].size()) {
  94.             ans = i;
  95.         }
  96.     }
  97.     fors(i, 0, group[ans].size())
  98.         std::cout << group[ans][i] + 1 << std::endl;
  99.  
  100.     return 0;
  101. }
Tags: olimp
Advertisement
Add Comment
Please, Sign In to add comment