Cod sursa(job #2108561)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 18 ianuarie 2018 15:31:44
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <math.h>
using namespace std;
ifstream cin("q.in");
ofstream cout("q.out");
const int nmax=200,cifmax=200;
struct huge
{
    short int l=0,v[cifmax+5];
};
huge dp[nmax+5][nmax+5];
huge a;
int n,k;
void give(int i,int j,huge *a)
{
    huge aux;
    aux.l=dp[i][j].l;
    for(int l=1;l<=dp[i][j].l;l++)
        aux.v[l]=dp[i][j].v[l];
    *a=aux;
}
void aduna(huge a,huge b,huge *c)
{
    huge x,y,z;
    int val=max(x.l,y.l),rest=0;
    z.l=val;
    for(int i=1;i<=val;i++)
    {
        z.v[i]=(x.v[i]+y.v[i]+rest)%10;
        rest=(x.v[i]+y.v[i]+rest)/10;
    }
    if(rest)
    {
        z.l++;
        z.v[z.l]=1;
    }
    *c=z;
}
void prod(huge a,int val,huge *b)
{
    huge aux,c=*a;
    aux.l=0;
    for(int i=1;i<=val;i++)
        aduna(&c,&aux,&aux);
    *b=aux;
}
void afisare(int i,int j)
{
    for(int l=1;l<=dp[i][j].l;l++)
        cout<<dp[i][j].v[l];
}
int main()
{
    cin>>n>>k;
    dp[1][1].l=1;
    dp[1][1].v[1]=1;
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            aduna(dp[i][j],dp[i-1][j-1],&dp[i][j]);
            prod(&dp[i][j],i-1,&a);
            aduna(dp[i][j],a,&dp[i][j]);
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            afisare(i,j);
            cout<<"\n";
        }
    }
    for(int i=1;i<=dp[n][k].l;i++)
        cout<<dp[n][k].v[i];
    return 0;
}
/**

**/