Editorial for Química (Versión Fácil)


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: aniervs

Indicemos los vértices desde 0. Digamos que B_i es el valor del vértice i en el segundo círculo, y A_i es el valor del vértice i en el primer círculo. Por definición

\begin{align}B_i = A_{(i - 1) \% n} + A_i + A_{(i+1)\%n}\\A_{(i + 1)\% n} = B_i - A_{(i-1)\% n} - A_i\end{align}

Fijemos los valores de A_0 y A_1. Propiamente, A_0 = x, A_1 = y. Entonces A_2 = B_1 - A_1 - A_0 = B_1 - y - x. Luego, A_3 = B_2 - A_2 - A_1 = B_2 - B_1 + y + x - y = B_2 - B_1 + x, y así sucesivamente con A_4, A_5, \dots, A_{n-1}. Podemos expresar cada A_i como una combinación lineal de x y y. Dicho de otra forma, A_i = a_i x + b_i y + c_i, y podemos computar a_i, b_i, c_i recurrentemente:

\displaystyle \begin{align}
A_{i-1} = a_{i-1} x + b_{i-1} y + c_{i-1}\\
A_{i} = a_{i} x + b_{i} y + c_{i}\\
A_{i + 1} = B_{i} - A_{i} - A_{i-1}\\
A_{i + 1} = B_{i} - a_{i} x - b_{i} y - c_i - a_{i-1} x - b_{i-1} y - c_{i-1}\\
A_{i+1} = (-a_i - a_{i-1}) x + (-b_i - b_{i-1}) y + B_i - c_i - c_{i-1}
\end{align}

Entonces, de aquí podemos obtener las ecuaciones recurrentes de a_i, b_i, c_i:

\displaystyle \begin{align}
a_{i+1} = -a_i - a_{i-1}\\
b_{i+1} = -b_i - b_{i-1}\\
c_{i+1} = -c_i - c_{i-1} + B_i
\end{align}

Como A_0 = x, A_1 = y, tenemos que:

  • a_0 = 1, b_0 = 0, c_0 = 0

  • a_1 = 0, b_1 = 1, c_1 = 0

Pero además, podemos computar a_0, b_0, c_0 a partir de a_{n-1}, b_{n-1}, c_{n-1} y a_{n-2}, b_{n-2}, c_{n-2}. Llamemos a esos valores a'_0, b'_0, c'_0.

\displaystyle \begin{align}
a'_{0} = -a_{n-1} - a_{n-2}\\
b'_{0} = -b_{n-1} - b_{n-2}\\
c'_{0} = -c_{n-1} - c_{n-2} + B_{n-1}
\end{align}

Similarmente:

\displaystyle \begin{align}
a'_{1} = -a'_{0} - a_{n-1}\\
b'_{1} = -b'_{0} - b_{n-1}\\
c'_{1} = -c'_{0} - c_{n-1} + B_{0}
\end{align}

Entonces, tenemos que:

\displaystyle \begin{align}
a_0 x + b_0 y + c_0 = a'_0 x + b'_0 y + c'_0 \\
a_1 x + b_1 y + c_1 = a'_1 x + b'_1 y + c'_1 \\
\end{align}

Resolviendo ese sistema de ecuaciones, podemos hallar x, y, y de esa manera computar A_0, A_1, \dots, A_{n-1}.

Como el problema garantiza que siempre existe una solución, y es única, el sistema de ecuaciones es soluble.

Solución de ejemplo:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

struct node{
    ll a, b, c;
} ans[1000001];

int n;
ll arr[1000001];

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);

    cin >> n;
    ans[0].a = 1, ans[0].b = 0, ans[0].c = 0;
    ans[1].a = 0, ans[1].b = 1, ans[1].c = 0;
    for(int i = 0; i < n; i++)
        cin >> arr[i];
    for(int i = 2; i < n+2; i++){
        ans[i%n].a = -ans[(i-1)%n].a - ans[(i-2)%n].a;
        ans[i%n].b = -ans[(i-1)%n].b - ans[(i-2)%n].b;
        ans[i%n].c = arr[(i-1)%n] - ans[(i-1)%n].c - ans[(i-2)%n].c;
    }

    ll X = 1LL - ans[0].a;
    ll Y = -ans[0].b;
    ll Z = -ans[1].a;
    ll R = 1LL - ans[1].b;

    ll A = (ans[0].c*R - ans[1].c*Y)/(X*R - Y*Z);
    ll B = (ans[0].c*Z - ans[1].c*X)/(Y*Z - X*R);

    for(int i = 0; i < n; i++)
        cout << ans[i].a * A + ans[i].b * B + ans[i].c << '\n';

    return 0;
}

Comments

There are no comments at the moment.