Cod sursa(job #1233577)

Utilizator cozmin97Gemene Cozmin cozmin97 Data 25 septembrie 2014 18:51:28
Problema Generare de permutari Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <cstring>
#define Nmax 202
#define In "perm.in"
#define Out "perm.out"

using namespace std;

int s[2][Nmax][501], N, K;
ofstream g(Out);
inline void Read()
{
    ifstream f(In);
    f>>N>>K;
    f.close();
}

void mul(int A[], int B)
{
      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;
}
void add(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 Write(int a[])
{
    for(int i = a[0]; i; --i)
        g<<a[i];
    g<<"\n";
}

inline void Solve()
{
    int lin,aux[501],i, j;
    s[1][1][0] = s[1][1][1] = 1;
    for(i = 2,lin = 0;i <= N; ++i,lin^=1)
    {
        for(j = 1;j <= K && j <= i; ++j)
        {
            memset(s[lin][j],0,sizeof(s[lin][j]));
            s[lin][j][0] = 1;
            memcpy(aux,s[lin^1][j],sizeof(s[lin^1][j]));
            mul(aux,i-1);
            add(aux,s[lin^1][j-1]);
            add(s[lin][j],aux);
        }
    }
}

int main()
{
    Read();
    Solve();
    Write(s[N&1][K]);
    return 0;
}