ProgMe

Codeforces_forever Round #1 (Div3) D

Apr 25th, 2020
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.86 KB | None | 0 0
  1. //решение
  2. Предположим, что заданный список делителей является списком почти всех делителей какого-то x (другими словами, предположим, что ответ существует). Тогда минимальный делитель, умноженный на максимальный делитель, должен быть равен x. Это правда, потому что если мы имеем делитель i, то мы также имеем делитель ni. Отсортируем все делители и положим x=d1⋅dn.
  3.  
  4. Теперь мы должны проверить, что все делители x кроме 1 и x являются перестановкой массива d (проверить, что наш ответ действительно верен). Мы можем найти все делители x за время O(x−−√), отсортировать их и сравнить с массивом d. Если массивы совпадают, то ответ равен x, иначе ответ -1.
  5. //реализация
  6. #include <bits/stdc++.h>
  7.  
  8. using namespace std;
  9.  
  10. int main() {
  11. #ifdef _DEBUG
  12. freopen("input.txt", "r", stdin);
  13. // freopen("output.txt", "w", stdout);
  14. #endif
  15.  
  16. int t;
  17. cin >> t;
  18. for (int i = 0; i < t; ++i) {
  19.  
  20. int n;
  21. cin >> n;
  22. vector<long long> d(n);
  23. for (int i = 0; i < n; ++i) {
  24. cin >> d[i];
  25. }
  26. sort(d.begin(), d.end());
  27. long long x = d[0] * d[n - 1];
  28.  
  29. vector<long long> dd;
  30. for (int i = 2; i * 1ll * i <= x; ++i) {
  31. if (x % i == 0) {
  32. dd.push_back(i);
  33. if (i != x / i) {
  34. dd.push_back(x / i);
  35. }
  36. }
  37. }
  38. sort(dd.begin(), dd.end());
  39.  
  40. if (dd == d) {
  41. cout << x << endl;
  42. } else {
  43. cout << -1 << endl;
  44. }
  45. }
  46.  
  47. return 0;
  48. }
Advertisement
Add Comment
Please, Sign In to add comment