Advertisement
a53

Pian

a53
Aug 18th, 2021
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define maxLen 100005
  3. using namespace std;
  4. ifstream fin("pian.in");
  5. ofstream fout("pian.out"), g("pian.txt");
  6. int C, N, A[maxLen], gcdN, L, imin, jmin;
  7. int ls, cnt;
  8. int seg[3 * maxLen];
  9. int gcd(int a, int b)
  10. {
  11. if (a == 0)
  12. return b;
  13. return gcd(b % a, a);
  14. }
  15. int build(int l, int r, int in, int* arr)
  16. {
  17. if (l == r)
  18. return seg[in] = arr[l];
  19. int mid = l + (r - l)/2;
  20. return seg[in] = gcd(build(l, mid, 2 * in + 1, arr),
  21. build(mid + 1, r, 2 * in + 2, arr));
  22. }
  23. int query(int l, int r, int l1, int r1, int in)
  24. {
  25. if (l1 <= l and r <= r1)
  26. return seg[in];
  27. if (l > r1 or r < l1)
  28. return 0;
  29. int mid = l + (r - l)/2;
  30. return gcd(query(l, mid, l1, r1, 2 * in + 1),
  31. query(mid + 1, r, l1, r1, 2 * in + 2));
  32. }
  33. int findLen(int* arr, int n)
  34. {
  35. build(0, n - 1, 0, arr);
  36. int i = 0, j = 0;
  37. int ans = INT_MAX;
  38. while(i < n)
  39. {
  40. while (j < n and query(0, n - 1, i, j, 0) != gcdN)
  41. j++;
  42. if(j == n)
  43. break;
  44. if(ans > j-i+1)
  45. {
  46. ans = min((j - i + 1), ans);
  47. imin=i+1;
  48. jmin=j+1;
  49. }
  50. i++;
  51. j = max(j, i);
  52. }
  53. return ans;
  54. }
  55. int main()
  56. {
  57. fin>>C;
  58. fin>>N>>gcdN;
  59. A[0]=gcdN;
  60. for(int i=1; i<N; ++i)
  61. {
  62. fin>>A[i];
  63. gcdN=gcd(gcdN,A[i]);
  64. }
  65. if(C==1)
  66. {
  67. fout<<N*gcdN;
  68. return 0;
  69. }
  70. L=findLen(A,N);
  71.  
  72. if(L<2)
  73. {
  74. fout<<N+L-2<<'\n';
  75. for(int i=jmin-1; i>0; --i)
  76. fout<<i<<" ";
  77. for(int i=jmin; i<N; ++i)
  78. fout<<i<<" ";
  79. }
  80. else
  81. {
  82. fout<<N+L-3<<'\n';
  83. for(int i=imin; i<jmin-1; ++i)
  84. fout<<i<<" ", cnt++;
  85. for(int i=jmin-1; i>0; --i)
  86. fout<<i<<" ", cnt++;
  87. int i=jmin;
  88. while(cnt<=N+L-3)
  89. {
  90. if(i<N)
  91. fout<<i<<" ";
  92. i++;
  93. cnt++;
  94. }
  95. }
  96. return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement