GastonFontenla

Hilera de ladrillos

Jun 13th, 2016
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.03 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <vector>
  5. #include <cmath>
  6.  
  7. #define ll long long
  8.  
  9. using namespace std;
  10.  
  11. ll a[] =
  12. {
  13.     1, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,
  14.     144, 233, 377, 610, 987, 1597, 2584,
  15.     4181, 6765, 10946, 17711, 28657, 46368,
  16.     75025, 121393, 196418, 317811, 514229,
  17.     832040, 1346269, 2178309, 3524578, 5702887,
  18.     9227465, 14930352, 24157817, 39088169,
  19.     63245986, 102334155, 165580141, 267914296,
  20.     433494437, 701408733
  21. }; ///Coeficientes de X
  22.  
  23. ll b[] =
  24. {
  25.     0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,
  26.     144, 233, 377, 610, 987, 1597, 2584,
  27.     4181, 6765, 10946, 17711, 28657, 46368,
  28.     75025, 121393, 196418, 317811, 514229,
  29.     832040, 1346269, 2178309, 3524578, 5702887,
  30.     9227465, 14930352, 24157817, 39088169,
  31.     63245986, 102334155, 165580141, 267914296,
  32.     433494437, 701408733, 1134903170
  33. }; ///Coeficientes de Y
  34.  
  35. ll convertirNumero(string a)
  36. {
  37.     stringstream ss;
  38.     ss << a;
  39.  
  40.     ll num;
  41.     ss >> num;
  42.  
  43.     return num;
  44. }
  45.  
  46. int cantLadrillos;
  47. ll pos1 = -1, val1;
  48. ll pos2 = -1, val2;
  49. ll resultados[50];
  50.  
  51. struct ECUACION
  52. {
  53.     /**
  54.     Para ecuaciones de la forma:
  55.     z = a*X + b*Y;
  56.     **/
  57.     ll z, a, b;
  58. };
  59.  
  60. struct FRACCION
  61. {
  62.     ll num, den;
  63.     ll valor()
  64.     {
  65.         return num/den;
  66.     }
  67. };
  68.  
  69. void resolver()
  70. {
  71.     ECUACION e1 = {val1, a[pos1], b[pos1]};
  72.     ECUACION e2 = {val2, a[pos2], b[pos2]};
  73.  
  74.     FRACCION X =
  75.     {
  76.         e1.z*e2.b - e2.z*e1.b,
  77.         e1.a*e2.b - e2.a*e1.b
  78.     };
  79.  
  80.     FRACCION Y =
  81.     {
  82.         e2.z - (e2.a*X.valor()),
  83.         e2.b
  84.     };
  85.  
  86.     for(int i=0; i<cantLadrillos; i++)
  87.         resultados[i] = a[i]*X.valor() + b[i]*Y.valor();
  88. }
  89.  
  90. int solve(istream &in, ostream &out)
  91. {
  92.     pos1 = -1;
  93.     pos2 = -1;
  94.  
  95.     string valor;
  96.     cantLadrillos = 0;
  97.  
  98.     while(in >> valor)
  99.     {
  100.         if(valor != "*")
  101.         {
  102.             if(pos1 == -1)
  103.             {
  104.                 pos1 = cantLadrillos;
  105.                 val1 = convertirNumero(valor);
  106.             }
  107.             else if(pos2 == -1)
  108.             {
  109.                 pos2 = cantLadrillos;
  110.                 val2 = convertirNumero(valor);
  111.             }
  112.         }
  113.         cantLadrillos++;
  114.     }
  115.    
  116.     ///Si llegase a ser todos asteriscos
  117.     if(pos1 == -1 && pos2 == -1)
  118.     {
  119.         ///La respuesta puede ser fibonacci
  120.         if(cantLadrillos == 1)
  121.             resultados[0] = 1;
  122.         else
  123.         {
  124.             resultados[0] = 1;
  125.             resultados[1] = 1;
  126.             for(int i=2; i<cantLadrillos; i++)
  127.                 resultados[i] = resultados[i-1]+resultados[i-2];
  128.         }
  129.     }
  130.     else if(pos2 == -1) ///Si solo tengo un dato
  131.     {
  132.         double divisor = (1+sqrt(5))/2;
  133.         if(cantLadrillos == 1)
  134.         {
  135.             resultados[pos1] = val1;
  136.         }
  137.         else if(pos1 == 0)
  138.         {
  139.             divisor = -divisor;
  140.             resultados[0] = val1;
  141.             resultados[1] = val1/divisor;
  142.  
  143.             for(int i=2; i<cantLadrillos; i++)
  144.                 resultados[i] = resultados[i-1]+resultados[i-2];
  145.         }
  146.         else if(pos1 == cantLadrillos-1)
  147.         {
  148.             resultados[pos1] = val1;
  149.             resultados[pos1-1] = val1/divisor;
  150.  
  151.             for(int i=pos1-2; i>=0; i--)
  152.                 resultados[i] = resultados[i+2] - resultados[i+1];
  153.         }
  154.         else ///Hay 1 solo valor en el medio
  155.         {
  156.             resultados[pos1] = val1;
  157.             resultados[pos1-1] = val1/divisor;
  158.  
  159.             for(int i=pos1-2; i>=0; i--)
  160.                 resultados[i] = resultados[i+2] - resultados[i+1];
  161.             for(int i=pos1+1; i<cantLadrillos; i++)
  162.                 resultados[i] = resultados[i-1]+resultados[i-2];
  163.         }
  164.     }
  165.     else
  166.         resolver();
  167.  
  168.     for(int i=0; i<cantLadrillos; i++)
  169.         out << resultados[i] << " ";
  170.     out << endl;
  171.  
  172.     return 0;
  173. }
  174.  
  175. int main()
  176. {
  177.     ifstream in("ladrillos.in");
  178.     ofstream out("ladrillos.out");
  179.  
  180.     int cant;
  181.     in >> cant;
  182.     solve(in, out);
  183.  
  184.     return 0;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment