fork download
  1. #include <bits/stdc++.h> // NeOWami
  2. using namespace std;
  3.  
  4. #define ft first
  5. #define sc second
  6. #define int long long
  7. using pii = pair<int, int>;
  8. const int N = 1e5 + 5;
  9. int n, b[N];
  10. int a[N];
  11.  
  12. //a1 = (∑_(i=1..(n+2)/3) [b[pos(2 + (i - 1) * 3)]] - n * (n + 1) / 2);
  13. inline int pos(int x) {
  14. x %= n;
  15. if (x == 0) x = n;
  16. return x;
  17. }
  18. namespace Type2 {
  19. int calc(int posStart) {
  20. int ans = 0;
  21. for (int i = 1; i <= (n + 2) / 3; i++) ans += b[pos(posStart + (i - 1) * 3)];
  22. ans -= n * (n + 1) / 2;
  23. return ans;
  24. }
  25. void solve() {
  26. a[1] = calc(2 % n);
  27. a[2] = calc(3 % n);
  28. for (int i = 3; i <= n; i++) a[i] = b[i - 1] - a[i - 1] - a[i - 2];
  29. for (int i = 1; i <= n; i++) cout << a[i] << " ";
  30. }
  31. };
  32.  
  33. //a1 = (∑_(i=1...(n*2+2)/3) [b[pos(2 + (i - 1) * 3)]] - n * (n + 1))
  34. namespace Type1 {
  35. int calc(int posStart) {
  36. int ans = 0;
  37. for (int i = 1; i <= (n * 2 + 2) / 3; i++) ans += b[pos(posStart + (i - 1) * 3)];
  38. ans -= n * (n + 1);
  39. return ans;
  40. }
  41. void solve() {
  42. a[1] = calc(2 % n);
  43. a[2] = calc(3 % n);
  44. for (int i = 3; i <= n; i++) a[i] = b[i - 1] - a[i - 1] - a[i - 2];
  45. for (int i = 1; i <= n; i++) cout << a[i] << " ";
  46. }
  47. };
  48.  
  49. namespace Type0 {
  50. int c[N], X[N], Y[N], Z[N], U, V, W, U2, V2, W2, m, P;
  51. void init() {
  52. m = n / 3;
  53. P = n * (n + 1) * (2 * n + 1) / 6;
  54. for (int i = 1; i <= n; i++) c[i] = b[i] - b[pos(i - 1)];
  55.  
  56. X[1] = U = U2 = 0;
  57. for (int i = 4; i <= n; i += 3) {
  58. X[i] = X[i - 3] + c[i - 1];
  59. U += X[i];
  60. U2 += X[i] * X[i];
  61. }
  62. Y[2] = V = V2 = 0;
  63. for (int i = 5; i <= n; i += 3) {
  64. Y[i] = Y[i - 3] + c[i - 1];
  65. V += Y[i];
  66. V2 += Y[i] * Y[i];
  67. }
  68. Z[3] = W = b[2];
  69. W2 = b[2] * b[2];
  70. for (int i = 6; i <= n; i += 3) {
  71. Z[i] = Z[i - 3] + c[i - 1];
  72. W += Z[i];
  73. W2 += Z[i] * Z[i];
  74. }
  75. }
  76.  
  77. pii PTB2(int a, int b, int c) {
  78. int delta = b * b - 4 * a * c;
  79. if (delta < 0) return {-1, -1};
  80. int sq = sqrtl(delta);
  81. int x1 = (-b - sq);
  82. if (x1 % (2 * a)) x1 = -1;
  83. else x1 /= (2 * a);
  84.  
  85. int x2 = (-b + sq);
  86. if (x2 % (2 * a)) x2 = -1;
  87. else x2 /= (2 * a);
  88.  
  89. if (x1 > x2) swap(x1, x2);
  90. return {x1, x2};
  91. }
  92.  
  93. void getAns(int x, int y) {
  94. a[1] = x, a[2] = y;
  95. for (int i = 3; i <= n; i++) a[i] = b[i - 1] - a[i - 1] - a[i - 2];
  96. for (int i = 1; i <= n; i++) cout << a[i] << " ";
  97. }
  98.  
  99. void solve() {
  100. init();
  101. for (int x = 1; x <= n; x++) {
  102. int a = 2 * m;
  103. int b = 2 * m * x + 2 * V - 2 * W;
  104. int c = U2 + V2 + W2 + 2 * m * x * x + 2 * x * U - 2 * x * W - P;
  105. pii y = PTB2(a, b, c);
  106. // cerr << x << " " << y.ft << " " << y.sc << "\n";
  107. if (y.ft >= 1 && y.ft <= n && y.ft != x) return getAns(x, y.ft);
  108. if (y.sc >= 1 && y.sc <= n && y.sc != x) return getAns(x, y.sc);
  109. }
  110. }
  111. };
  112.  
  113. signed main() {
  114. cin.tie(NULL)->sync_with_stdio(false);
  115. if(ifstream("CIRCLE.inp")) {
  116. freopen("CIRCLE.inp", "r", stdin);
  117. freopen("CIRCLE.out", "w", stdout);
  118. }
  119. cin >> n;
  120. if (n == 1) return cout << 1, 0;
  121.  
  122. for (int i = 1; i <= n; i++) cin >> b[i];
  123. if (n % 3 == 2) return Type2::solve(), 0;
  124. if (n % 3 == 1) return Type1::solve(), 0;
  125. return Type0::solve(), 0;
  126. return 0;
  127. }
  128.  
  129. /*
  130.  
  131. if (n % 3 == 2)
  132.  
  133. 1 2 3 4 5 6 7 8
  134. a1 = (b2 + b5 + b8 - ∑_(i=1..8)[i]) / 2
  135. or:
  136. a1 = ∑_(i=2; i <= n; i += 3) [bi] - n * (n + 1) / 2
  137. or a1 = ∑_(i=1..(n+2)/3) [b[pos(2 + (i - 1) * 3)]] - n * (n + 1) / 2;
  138.  
  139. if (n % 3 == 1)
  140. 1 2 3 4 5 6 7
  141. 1 2 3 4 5 6 7 8 9 10
  142. a1 = b2 + b5 + b1 + b4 + b7 - 2 * ∑_(i=1..8)[i]
  143. or:
  144. a1 = ∑_(i=1...(n*2+2)/3) [b[pos(2 + (i - 1) * 3)]] - n * (n + 1)
  145.  
  146.  
  147. if (n % 3 == 0)
  148. ý tưởng: giả sử cố định a1, có cách nào tìm a2 nhỏ nhát sao cho thỏa mãn hay không
  149. (dễ dàng code trâu n ^ 3, giờ ta thử cải tiến nó lên để AC trường hợp n % 3 == 0)
  150.  
  151. vì n ≡ 0 (mod 3), ta thử chia ra thành các cụm ≡ 0, 1, 2 để xử lý và tính toán
  152.  
  153. dễ tính được b[i] - b[i - 1] = a[i + 1] - a[i - 2];
  154. đặt c[i] = b[i] - b[i - 1];
  155. a[i + 1] = a[i - 2] + c[i]
  156. Hay a[i] = a[i - 3] + c[i - 1] (1)
  157. ⇒ ta tìm ra được nhận định sau:
  158. +Nếu có a[i] ta sẽ tính được a[i + 3]
  159.  
  160. Gọi X[i] là giá trị chênh lệch của a[i] cho a[1] với i ≡ 1 (mod 3);
  161.   Y[i] là giá trị chênh lệch của a[i] cho a[2] với i ≡ 2 (mod 3);
  162.   Z[i] là giá trị chênh lệch của a[i] cho a[3] - b[2] với i ≡ 0 (mod 3) (xem ở dưới để hiểu lý do);
  163.  
  164. Đặt:
  165. a[1] = x
  166. a[2] = y
  167. dễ thấy:
  168. nếu i ≡ 1 (mod 3): a[i] = x + X[i];
  169. nếu i ≡ 2 (mod 3): a[i] = y + Y[i];
  170. nếu i ≡ 0 (mod 3): a[i] = (- x - y) + Z[i];
  171. với:
  172. X[1] = 0, với i = 4,7,.. X[i] = X[i - 3] + c[i - 1] (c/m từ (1))
  173. Y[2] = 0, với i = 5,8,.. Y[i] = Y[i - 3] + c[i - 1] (...)
  174. Z[3] = b[2], với i = 6,9,.. Z[i] = Z[i - 3] + c[i - 1] (... và vì b[2] = a[1] + a[2] + a[2] ⇒ a[3] = b[2] - x - y)
  175.  
  176. Bằng cách biến đổi này, ngoài x và y, tất cả các giá trị còn lại đều là hằng số và có thể tính được
  177. Do đó ta tìm cách giải y khi có x
  178. Đặt m = n / 3
  179.  
  180. Tới đây nếu cố tình bằng cách giải thay vào ∑_(i=1..n) [a[i]] = n * (n + 1) / 2 thì chắc chắn sẽ không ra (*)
  181. (có thể tự làm thử để hiểu vì sao =))) )
  182.  
  183. *Ta chuyển sang sài: ∑_{i=1..n} a[i] ^ 2
  184. Ký hiệu:
  185. U = ∑_{i=1..n} X[i]; U2 = ∑_{i=1..n} X[i]^2;
  186. V = ∑_{i=1..n} Y[i]; V2 = ∑_{i=1..n} Y[i]^2;
  187. W = ∑_{i=1..n} Z[i]; W2 = ∑_{i=1..n} Z[i]^2;
  188.  
  189. Khai triển: ∑_{i=1..n} a[i] ^ 2
  190. = ∑_{i=1,4,..} (x+X[i])^2 + ∑_{i=2,5,..} (y+Y[i])^2 + ∑_{i=3,6,..} (-x-y+W[i])^2
  191. = m*x^2 + 2*x*U + U2 + m*y^2 + 2*y*V + V2 + m*x^2 + m*y^2 + W2 + m*2*x*y -2*x*W -2*y*W
  192. = 2m*y^2 + (2m*x+ 2*V - 2*W)y + (U2 + V2 + W2 + 2*m*x^2 + 2*x*U -2*x*W)
  193. Mà ta có: ∑_{i=1..n} a[i] ^ 2 = n*(n+1)*(2n+1)/6 ( = P)
  194. ⇔ 2m*y^2 + (2m*x + 2*V - 2*W)y + (U2 + V2 + W2 + 2*m*x^2 + 2*x*U -2*x*W - P) = 0
  195. Tới đây khi thay x, ta có thể giải y như giải PT bậc 2
  196.  
  197. Vậy ta có thể giải bài này với O(n)
  198.  
  199. P/S:
  200. lý do phải chia trường hợp liên quan trực tiếp tới (*)
  201. ∑_{i=1..n} (a[i]) = n * (n + 1) / 2 (I)
  202. ⇔ n0*x + U + n1*y + V - n2*(x + y) + W = n * (n + 1) / 2;
  203.  
  204. Nếu n % 3 == 0:
  205. ta được n0 = n1 = n2 = m, do đó triệt tiêu hết x, y
  206. Từ đó sẽ luôn ra phương trình PT (I) luôn đúng với mọi x, y
  207. Do đó ta chỉ cần giải phương trình ∑_{i=1..n} a[i] ^ 2 = P
  208.  
  209. Còn với n % 3 != 0, ta chuyển sang giải bài toán hệ phương trình:
  210. + ∑_{i=1..n} (a[i]) = n * (n + 1) / 2
  211. + ∑_{i=1..n} (a[i] ^ 2) = P
  212. Tới đây sài cách cũ vẫn code ngắn và tốt hơn nhiều
  213.  
  214. */
Success #stdin #stdout 0.01s 5296KB
stdin
Standard input is empty
stdout
Standard output is empty