Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <sstream>
- #include <vector>
- #include <cmath>
- #define ll long long
- using namespace std;
- ll a[] =
- {
- 1, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,
- 144, 233, 377, 610, 987, 1597, 2584,
- 4181, 6765, 10946, 17711, 28657, 46368,
- 75025, 121393, 196418, 317811, 514229,
- 832040, 1346269, 2178309, 3524578, 5702887,
- 9227465, 14930352, 24157817, 39088169,
- 63245986, 102334155, 165580141, 267914296,
- 433494437, 701408733
- }; ///Coeficientes de X
- ll b[] =
- {
- 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,
- 144, 233, 377, 610, 987, 1597, 2584,
- 4181, 6765, 10946, 17711, 28657, 46368,
- 75025, 121393, 196418, 317811, 514229,
- 832040, 1346269, 2178309, 3524578, 5702887,
- 9227465, 14930352, 24157817, 39088169,
- 63245986, 102334155, 165580141, 267914296,
- 433494437, 701408733, 1134903170
- }; ///Coeficientes de Y
- ll convertirNumero(string a)
- {
- stringstream ss;
- ss << a;
- ll num;
- ss >> num;
- return num;
- }
- int cantLadrillos;
- ll pos1 = -1, val1;
- ll pos2 = -1, val2;
- ll resultados[50];
- struct ECUACION
- {
- /**
- Para ecuaciones de la forma:
- z = a*X + b*Y;
- **/
- ll z, a, b;
- };
- struct FRACCION
- {
- ll num, den;
- ll valor()
- {
- return num/den;
- }
- };
- void resolver()
- {
- ECUACION e1 = {val1, a[pos1], b[pos1]};
- ECUACION e2 = {val2, a[pos2], b[pos2]};
- FRACCION X =
- {
- e1.z*e2.b - e2.z*e1.b,
- e1.a*e2.b - e2.a*e1.b
- };
- FRACCION Y =
- {
- e2.z - (e2.a*X.valor()),
- e2.b
- };
- for(int i=0; i<cantLadrillos; i++)
- resultados[i] = a[i]*X.valor() + b[i]*Y.valor();
- }
- int solve(istream &in, ostream &out)
- {
- pos1 = -1;
- pos2 = -1;
- string valor;
- cantLadrillos = 0;
- while(in >> valor)
- {
- if(valor != "*")
- {
- if(pos1 == -1)
- {
- pos1 = cantLadrillos;
- val1 = convertirNumero(valor);
- }
- else if(pos2 == -1)
- {
- pos2 = cantLadrillos;
- val2 = convertirNumero(valor);
- }
- }
- cantLadrillos++;
- }
- ///Si llegase a ser todos asteriscos
- if(pos1 == -1 && pos2 == -1)
- {
- ///La respuesta puede ser fibonacci
- if(cantLadrillos == 1)
- resultados[0] = 1;
- else
- {
- resultados[0] = 1;
- resultados[1] = 1;
- for(int i=2; i<cantLadrillos; i++)
- resultados[i] = resultados[i-1]+resultados[i-2];
- }
- }
- else if(pos2 == -1) ///Si solo tengo un dato
- {
- double divisor = (1+sqrt(5))/2;
- if(cantLadrillos == 1)
- {
- resultados[pos1] = val1;
- }
- else if(pos1 == 0)
- {
- divisor = -divisor;
- resultados[0] = val1;
- resultados[1] = val1/divisor;
- for(int i=2; i<cantLadrillos; i++)
- resultados[i] = resultados[i-1]+resultados[i-2];
- }
- else if(pos1 == cantLadrillos-1)
- {
- resultados[pos1] = val1;
- resultados[pos1-1] = val1/divisor;
- for(int i=pos1-2; i>=0; i--)
- resultados[i] = resultados[i+2] - resultados[i+1];
- }
- else ///Hay 1 solo valor en el medio
- {
- resultados[pos1] = val1;
- resultados[pos1-1] = val1/divisor;
- for(int i=pos1-2; i>=0; i--)
- resultados[i] = resultados[i+2] - resultados[i+1];
- for(int i=pos1+1; i<cantLadrillos; i++)
- resultados[i] = resultados[i-1]+resultados[i-2];
- }
- }
- else
- resolver();
- for(int i=0; i<cantLadrillos; i++)
- out << resultados[i] << " ";
- out << endl;
- return 0;
- }
- int main()
- {
- ifstream in("ladrillos.in");
- ofstream out("ladrillos.out");
- int cant;
- in >> cant;
- solve(in, out);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment