G.cpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int gcd(int a, int b) {
  4. int t;
  5. while (b != 0) {
  6. t = b;
  7. b = a % b;
  8. a = t;
  9. }
  10. return a;
  11. }
  12. int d[10000005];
  13. class BalanceScale {
  14. public:
  15. int takeWeights(vector<int> w) {
  16. int i, tmp;
  17. int n = w.size();
  18. tmp = w[0];
  19. for (i = 1; i < n; ++i) {
  20. tmp = gcd(tmp, w[i]);
  21. }
  22. for (i = 0; i < n; ++i) {
  23. w[i] /= tmp;
  24. }
  25. sort(w.begin(), w.end());
  26. if (w[0] == 1)
  27. return 1;
  28. memset(d, 1, sizeof(d));
  29. queue<int> q;
  30. for (i = 0; i < n; ++i) {
  31. q.push(w[i]);
  32. d[w[i]] = 1;
  33. }
  34. while (!q.empty() && d[1] == 0x01010101) {
  35. int top = q.front();
  36. q.pop();
  37. for (i = 0; i < n; ++i) {
  38. tmp = gcd(top, w[i]);
  39. if (d[tmp] == 0x01010101) {
  40. d[tmp] = d[top] + 1;
  41. q.push(tmp);
  42. }
  43. }
  44. }
  45. return d[1];
  46. }
  47. };
  48. int main() {
  49. int n;
  50. vector<int> w;
  51. BalanceScale solution;
  52. while (cin >> n, n) {
  53. w.clear();
  54. int data;
  55. for (int i = 0; i < n; ++i) {
  56. cin >> data;
  57. w.push_back(data);
  58. }
  59. cout << solution.takeWeights(w) << endl;
  60. }
  61. return 0;
  62. }