Cod sursa(job #1812306)

Utilizator razvan99hHorhat Razvan razvan99h Data 21 noiembrie 2016 22:48:29
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("patrate2.in");
ofstream fout("patrate2.out");
typedef struct numar {int nrc; int c[4005];} NUMAR;
NUMAR a,b,c,d;
int n;

void init(NUMAR &x, int val)
{
    int i;
    for(i=2;i<=4000;i++)
        x.c[i]=0;
    x.c[1]=val;
    x.nrc=1;

}
void produs(NUMAR x, NUMAR y, NUMAR &z)///z=x*y
{
    int i, j, t, s;
    init(z,0);
    for(i=1;i<=x.nrc;i++)
        for(j=1;j<=y.nrc;j++)
            z.c[i+j-1]+=x.c[i]*y.c[j];

    t=0;
    for(i=1;i<=4000;i++)
    {
        s=z.c[i]+t;
        z.c[i]=s%10;
        t=s/10;
    }
    i=4000;
    while(z.c[i]==0)
        i--;
    z.nrc=i;
}
void produs_cu_scalar(NUMAR a, int x, NUMAR &b)///b=a*x;
{
    init(b,0);
    int i, t, s;
    for(i=1;i<=a.nrc;i++)
        b.c[i]=a.c[i]*x;
    t=0;
    for(i=1;i<=4000;i++)
    {
        s=b.c[i]+t;
        b.c[i]=s%10;
        t=s/10;
    }
    i=4000;
    while(b.c[i]==0)
        i--;
    b.nrc=i;
}
void fact(int n, NUMAR &z)
{
    for(int i=1;i<=n;i++)
        produs_cu_scalar(z,i,z);
}
void lg_pow(NUMAR a, NUMAR &p, int n)
{
    init(p,1);
    while(n>0)
    {
        if(n%2==0)
        {
            produs(a,a,a);
            n=n/2;
        }
        else
        {
            produs(p,a,p);
            n--;
        }
    }
}
void afisare(NUMAR &a)
{
    for(int i=a.nrc;i>=1;i--)
        fout<<a.c[i];
}

int main()
{
    fin>>n;
    init(a,2);
    init(b,2);
    init(c,1);
    lg_pow(a,a,n); lg_pow(b,b,n-1); lg_pow(b,b,n); fact(n,c);

    produs(a,b,a);
    produs(a,c,a);
    afisare(a);
    //x=pow(2,n)*pow(pow(2,n-1),n)*fact(n);
    return 0;
}