Cod sursa(job #2167767)

Utilizator xRoALexBirtoiu Alexandru xRoALex Data 13 martie 2018 23:25:45
Problema Dezastru Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#define B 1000000
#include <algorithm>
#include <cstdio>
#include <cstring>
#include<iomanip>
using namespace std;

ifstream f("petrecere.in");
ofstream g("petrecere.out");
int p1=0,p2=1,p3=2,n;
int d[4][3005];

void inmultire(int v[3005],int x)
{
    int t=0;
    for(int i=1;i<=v[0];i++)
    {
        t = v[i]*x + t;
        v[i] = t%B;
        t = t/B;
    }
    if(t)
    {
        v[0]++;
        v[v[0]]=t;
    }
}

void adunare(int a[3005],int b[3005])
{
    int t=0;
    for(int i=1;i<=max(a[0],b[0]);i++)
    {
        t= a[i] + b[i] +t;
        a[i]=t%B;
        t=t/B;
    }
    a[0] = max(a[0],b[0]);
    if(t)
    {
        a[0]++;
        a[a[0]]=t;
    }
}

int main()
{
    f>>n;
    d[p1][1] = 1;
    d[p1][0] = 1;
    d[p2][1] = 2;
    d[p2][0] = 1;
    if(n==1)
        {
        g<<1<<'\n';
        return 0;
        }
    if(n==2)
        {
            g<<2<<'\n';
            return 0;
        }
    for(int i=3;i<=n;i++)
    {
        for(int j=1;j<=d[p3][0];j++)
            d[p3][j]=0;
        d[p3][0]=0;
        inmultire(d[p1],i-1);
        adunare(d[p3],d[p2]);
        adunare(d[p3],d[p1]);
        p1 = (p1+1)%3;
        p2 = (p2+1)%3;
        p3 = (p3+1)%3;
    }
    g<<d[p2][d[p2][0]];
    for(int i=d[p2][0]-1;i>=1;i--)
        g<<setw(6)<<setfill('0')<<d[p2][i];
    return 0;
}