Cod sursa(job #1557708)

Utilizator Alex_dudeDudescu Alexandru Alex_dude Data 28 decembrie 2015 00:14:38
Problema Text Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <cstdio>
#define nmax 201
using namespace std;

typedef int Huge[1001];

FILE *fin = fopen("perm.in", "r"), *fout = fopen("perm.out", "w");

Huge s[2][nmax];

void AtribHuge(Huge H, Huge X)
{
  int i;
  for (i = 0; i <= X[0]; ++i) {
    H[i] = X[i];
  }
}
void Afis(Huge H)
{
    int n = H[0];
    if(!n) fprintf(fout,"0");
    else
    while(n)
        fprintf(fout,"%d",H[n--]);
}
void Atrib(Huge H, int x)
{

  H[0] = 0;

  do
  {
    H[++H[0]] = x%10;
    x/=10;

  }while(x);

}
void Subtract(Huge A, Huge B)
{
    int i, T=0;

  for (i=B[0]+1;i<=A[0];) B[i++]=0;
  for (i=1;i<=A[0];i++)
    A[i]+= (T=(A[i]-=B[i]+T)<0) ? 10 : 0;
  while (!A[A[0]]) A[0]--;

}
void Mult(Huge H, long X)
{
  int i;
  unsigned long T=0;

  for (i=1;i<=H[0];i++)
    { H[i]=H[i]*X+T;
      T=H[i]/10;
      H[i]=H[i]%10;
    }
  while (T) /* Cat timp exista transport */
    { H[++H[0]]=T%10;
      T/=10;
    }
}
void Add(Huge A, Huge B)
/* A <- A+B */
{ int i,T=0;

  if (B[0]>A[0])
    { for (i=A[0]+1;i<=B[0];) A[i++]=0;
      A[0]=B[0];
    }
    else for (i=B[0]+1;i<=A[0];) B[i++]=0;
  for (i=1;i<=A[0];i++)
    { A[i]+=B[i]+T;
      T=A[i]/10;
      A[i]%=10;
    }
  if (T) A[++A[0]]=T;
}


void stirling(int n,int m)
{
    int i,j;

    Atrib(s[0][1],1);
    Atrib(s[0][2],1);

    i=3;
    while(i<=n)
    {

        Atrib(s[0][0], 0);

        for(j=1;j<=m;j++)
        {

            Huge a,b;

            AtribHuge(a,s[0][j-1]);
            AtribHuge(b,s[0][j]);
            Mult(b,(i-1));
            if(j==1)

                Subtract(b,a);

            else
                Add(b,a);
            AtribHuge(s[1][j],b);
        }

        for(j=1;j<=m;j++)
            AtribHuge(s[0][j],s[1][j]);

        i++;
    }
}

int main()
{


    int n,m,i,j;
    fscanf(fin,"%d %d",&n,&m);
    stirling(n,m);
    Afis(s[0][m]);

    return 0;
}