Cod sursa(job #1119615)

Utilizator sorynsooSorin Soo sorynsoo Data 24 februarie 2014 18:53:56
Problema Culori Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.65 kb
#include <fstream>
#include <cstdio>
using namespace std;
ifstream cin("culori1.in");
ofstream cout("culori1.out");
int v1[801],v2[801],v3[801],v4[801],v5[801],v1_aux[801],v2_aux[801],v3_aux[801],v4_aux[801],v5_aux[801],n,i,j,sum[801],sumcr[801];
inline void inmulteste_2(int A[])
{
     int B=2;
      int i, t = 0;
      for (i = 1; i <= A[0] || t; i++, t /= 10)
              A[i] = (t += A[i] * B) % 10;
      A[0] = i - 1;
}
inline void aduna(int A[], int B[])
{
      int i, t = 0;
      for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
              A[i] = (t += A[i] + B[i]) % 10;
      A[0] = i - 1;
}
inline void scade(int A[], int B[])
{
      int i, t = 0;
      for (i = 1; i <= A[0]; i++) {
              A[i] -= ((i <= B[0]) ? B[i] : 0) + t;
              A[i] += (t = A[i] < 0) * 10;
      }
      for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
inline void copiaza(int A[], int B[])
{
    int i;
    for(i=B[0]; i<=A[0]; i++)
        A[i]=0;
    for(i=0; i<=B[0]; i++)
        A[i]=B[i];
}
inline void sterge(int A[])
{
    int i=1,last;
    for(i=1; i<=720; i++)
    {
        if(A[i]!=0)
            last=i;
        if(i>A[0] && i-last>5)
            break;
        A[i]=0;
    }
    /*for(i=1; i<=700; i++)
        if(A[i]!=0)
        cout<<"prost";*/
        A[i]=0;
    A[0]=0;
}
int main()
{
    cin>>n;
    //albe
    sterge(sumcr);  sterge(v1); sterge(v2); sterge(v3); sterge(v4); sterge(v5); sterge(v1_aux); sterge(v2_aux); sterge(v3_aux); sterge(v4_aux); sterge(v5_aux);
    sumcr[0]=1; sumcr[1]=1; v1[0]=1; v1[1]=1;
    for(i=2; i<=n; i++)
    {
        inmulteste_2(sumcr);
        scade(sumcr,v1);
        scade(sumcr,v5);
        copiaza(v1_aux,v1); copiaza(v2_aux,v2); copiaza(v3_aux,v3); copiaza(v4_aux,v4); copiaza(v5_aux,v5);
        copiaza(v1,v2_aux);
        sterge(v2); aduna(v2,v1_aux); aduna(v2,v3_aux);
        sterge(v3); aduna(v3,v2_aux); aduna(v3,v4_aux);
        sterge(v4); aduna(v4,v3_aux); aduna(v4,v5_aux);
        sterge(v5); copiaza(v5,v4_aux);
    }
    inmulteste_2(sumcr);
    aduna(sum,sumcr);
    //albastre
    sterge(sumcr);  sterge(v1); sterge(v2); sterge(v3); sterge(v4); sterge(v5); sterge(v1_aux); sterge(v2_aux); sterge(v3_aux); sterge(v4_aux); sterge(v5_aux);
    sumcr[0]=1; sumcr[1]=1; v2[0]=1; v2[1]=1;
    for(i=2; i<=n; i++)
    {
        inmulteste_2(sumcr);
        scade(sumcr,v1);
        scade(sumcr,v5);
        copiaza(v1_aux,v1); copiaza(v2_aux,v2); copiaza(v3_aux,v3); copiaza(v4_aux,v4); copiaza(v5_aux,v5);
        copiaza(v1,v2_aux);
        sterge(v2); aduna(v2,v1_aux); aduna(v2,v3_aux);
        sterge(v3);
        aduna(v3,v2_aux);
        aduna(v3,v4_aux);
        sterge(v4); aduna(v4,v3_aux); aduna(v4,v5_aux);
        sterge(v5); copiaza(v5,v4_aux);
    }
    inmulteste_2(sumcr);
    aduna(sum,sumcr);
    //rosu
    sterge(sumcr);  sterge(v1); sterge(v2); sterge(v3); sterge(v4); sterge(v5); sterge(v1_aux); sterge(v2_aux); sterge(v3_aux); sterge(v4_aux); sterge(v5_aux);
    sumcr[0]=1; sumcr[1]=1; v3[0]=1; v3[1]=1;
    for(i=2; i<=n; i++)
    {
        inmulteste_2(sumcr);
        scade(sumcr,v1);
        scade(sumcr,v5);
        copiaza(v1_aux,v1); copiaza(v2_aux,v2); copiaza(v3_aux,v3); copiaza(v4_aux,v4); copiaza(v5_aux,v5);
        copiaza(v1,v2_aux);
        sterge(v2); aduna(v2,v1_aux); aduna(v2,v3_aux);
        sterge(v3); aduna(v3,v2_aux); aduna(v3,v4_aux);
        sterge(v4); aduna(v4,v3_aux); aduna(v4,v5_aux);
        sterge(v5); copiaza(v5,v4_aux);
    }
    aduna(sum,sumcr);
    FILE *f=fopen("culori1.in","r");
    f=fopen("culori1.out","w");
    for(i=sum[0]; i>=1; i--)
        cout<<fprintf(f,"%d",sum[i]);
}