Editorial for Química (Versión Fácil)
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Indicemos los vértices desde 0. Digamos que es el valor del vértice en el segundo círculo, y es el valor del vértice en el primer círculo. Por definición
Fijemos los valores de y . Propiamente, . Entonces . Luego, , y así sucesivamente con . Podemos expresar cada como una combinación lineal de y . Dicho de otra forma, , y podemos computar recurrentemente:
Entonces, de aquí podemos obtener las ecuaciones recurrentes de :
Como , tenemos que:
Pero además, podemos computar a partir de y . Llamemos a esos valores .
Similarmente:
Entonces, tenemos que:
Resolviendo ese sistema de ecuaciones, podemos hallar , y de esa manera computar .
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