Cod sursa(job #1719595)

Utilizator giotoPopescu Ioan gioto Data 19 iunie 2016 18:38:48
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <cstdio>
using namespace std;

long long n,nr,b[102],a[4002],c[4002];
int main()
{
    freopen("patrate2.in", "r", stdin);
    freopen("patrate2.out", "w", stdout);
    scanf("%d", &n);
    int arie=n*n;
    while(arie>0){
        b[++nr]=arie%2;
        arie/=2;
    }
    a[0]=1;a[1]=1;
    for(int i=nr;i>=1;--i){
        c[0]=a[0]+a[0]-1;
        for(int j=1;j<=a[0];++j)
            for(int t=1;t<=a[0];++t){
                c[j+t-1]+=a[j]*a[t];
            }
        a[0]=c[0];
        int t=0;
        for(int i=1;i<=c[0];++i){
            t=(c[i]+=t)/10;
            c[i]=c[i]%10;
            a[i]=c[i];c[i]=0;
        }
        if(t)
            a[++a[0]]=t;

        if(b[i]==1){
            for(int j=a[0];j>=1;--j){
                a[j]*=2;a[j+1]+=a[j]/10;
                a[j]=a[j]%10;
            }
            if(a[a[0]+1]>0) ++a[0];
        }
    }
    for(int i=2;i<=n;++i){
        for(int j=a[0];j>=1;--j){
            a[j]*=i;a[j+1]+=a[j]/10;
            a[j]=a[j]%10;
        }
        for(int j=1;j<=a[0];++j){
            a[j+1]+=a[j]/10;
            a[j]=a[j]%10;
        }
        while(a[a[0]+1]>0){
            ++a[0];
            a[a[0]+1]=a[a[0]]/10;
            a[a[0]]=a[a[0]]%10;
        }
    }
    if(a[a[0]+1]>0) ++a[0];
    for(int i=a[0];i>=1;--i)
        printf("%d",a[i]);
    return 0;
}