Cod sursa(job #1852830)

Utilizator Coroian_DavidCoroian David Coroian_David Data 21 ianuarie 2017 10:55:25
Problema 12-Perm Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <cstdio>

#define MOD 1048576

using namespace std;

FILE *f, *g;

int n;

//int stk[20], k, ap[20], cnt[20];

int dp[5];

inline int poz(int a)
{
    return (a < 0 ? (-a) : a);
}

void readFile()
{
    f = fopen("12perm.in", "r");

    fscanf(f, "%d", &n);

    fclose(f);
}
/*
void verif(int k)
{
    memset(ap, 0, sizeof(ap));

    int i;
    for(i = 1; i <= k; i ++)
    {
        if(stk[i] > k)
            return;

        if(ap[stk[i]] == 1)
            return;

        ap[stk[i]] = 1;

        if(i < k && poz(stk[i + 1] - stk[i]) >= 3)
            return;
    }

    cnt[k] ++;
}*/

int lib = 4, ant = 3, ant2 = 2, ant3 = 1;

void solve()
{
    /*int k = 1;
    stk[k] = 0;

    while(k > 0)
    {
        if(stk[k] < 9)
        {
            stk[k] ++;

            verif(k);

            if(k < 9)
                k ++, stk[k] = 0;
        }

        else
            k --;
    }*/

    dp[1] = 2;
    dp[2] = 6;
    dp[3] = 12;
    int i, aux;
    for(i = 4; i <= n; i ++)
    {
        dp[lib] = dp[ant] + dp[ant3] + 2 * (i + 1 - 2);
        dp[lib] %= MOD;

        aux = lib;

        lib = ant3;
        ant3 = ant2;
        ant2 = ant;
        ant = aux;
    }
}

void printFile()
{
    g = fopen("12perm.out", "w");

    int i;
  /*  for(i = 1; i <= 9; i ++)
    {
        printf("%d\n", c[i]);
    }
*/
    if(n > 4)
        fprintf(g, "%d\n", dp[ant]);

    else
    {
        int rez = 1;
        for(i = 1; i <= n; i ++)
            rez *= i;

        if(n == 4)
            rez /= 2;

        fprintf(g, "%d\n", rez);
    }


    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}