Cod sursa(job #1830825)

Utilizator AdrianGotcaAdrian Gotca AdrianGotca Data 17 decembrie 2016 10:35:35
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;

int a[10005],b[10005],c[10005],d[10005];
void fact(int);
void scalar(int [],int);
void aduna(int [],int [],int);
void mult(int [],int []);
void power(int,int);
int n;
int main(){
    freopen("patrate2.in","r",stdin);
    freopen("patrate2.out","w",stdout);
    cin>>n;
    fact(n);
    power(2,n*n);
    mult(a,b);
    for (int i=c[0];i>0;i--){
        cout<<c[i];
    }
}

void fact(int n){
    int t=0;
    a[0]=a[1]=1;
    for (int nr=2;nr<=n;nr++){
        t=0;
        for (int i=1;i<=a[0];i++){
            a[i]=a[i]*nr+t;
            t=a[i]/10;
            a[i]=a[i]%10;
        }
        while (t){
            a[++a[0]]=t%10;
            t/=10;
        }
    }
}

void power(int base,int exponent){
    int t=0;
    b[0]=b[1]=1;
    for (int nr=1;nr<=exponent;nr++){
        t=0;
        for (int i=1;i<=b[0];i++){
            b[i]=b[i]*base+t;
            t=b[i]/10;
            b[i]=b[i]%10;
        }
        while (t){
            b[++b[0]]=t%10;
            t/=10;
        }
    }
}

void mult(int a[],int b[]){
    for (int i=1;i<=a[0];i++){
        scalar(b,a[i]);
        aduna(c,d,i-1);
    }
}

void scalar(int a[],int s){
    int t=0;
    d[0]=a[0];
    for (int i=1;i<=a[0];i++){
        d[i]=a[i]*s+t;
        t=d[i]/10;
        d[i]%=10;
    }
    while (t){
        d[++d[0]]=t%10;
        t/=10;
    }
}

void aduna(int a[],int b[],int pos){
    int t=0;
    a[0]=b[0]+pos;
    for (int i=1;i<=b[0];i++){
        a[i+pos]+=b[i]+t;
        t=a[i+pos]/10;
        a[i+pos]%=10;
    }
    while (t){
        a[++a[0]]=t%10;
        t/=10;
    }
}