Cod sursa(job #832295)

Utilizator emiemiEmi Necula emiemi Data 10 decembrie 2012 12:05:04
Problema Patrate2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<fstream>
using namespace std;
ifstream f("patrate2.in");
ofstream g("patrate2.out");
int a[5],c,k,p,n,i,j,r[161][5000],rez[5000],vp[21],v63[]={19,8,0,8,5,7,7,4,5,8,6,3,0,2,7,3,3,2,2,9};
long long put;
void inmultire(int a[],int b[],int c[])
{
    int i,t=0,j,n=a[0]-1+b[0];
    for(i=1;i<=a[0];++i)
    for(j=1;j<=b[0];++j)
    c[i+j-1]+=a[i]*b[j];
    for(i=1;i<=n||t;++i)
    {c[i]+=t;
    t=c[i]/10;
    c[i]%=10;
    }
    c[0]=i-1;
}
int main()
{
    f>>n;
    if(n==1)
    g<<"2";
    else
    if(n==2)
    g<<"32";
    else
    {
        k=(n*n)/63;
        p=(n*n)%63;
        put=1<<p;
        while(put!=0)
        {
            c=put%10; put/=10;
            ++vp[0];
            vp[vp[0]]=c;
        }
        r[0][0]=1; r[0][1]=1;
        for(i=1;i<=k;++i)
        inmultire(r[i-1],v63,r[i]);
        inmultire(r[k],vp,r[160]);
        for(i=1;i<=r[2][0];++i)
        r[2][i]=0;
        r[2][0]=1; r[2][1]=2;
        for(i=3;i<=n;++i)
        {
            if(i==100)
            {
                a[0]=3; a[1]=1; a[2]=0; a[3]=0;
            }
            else
            if(i>9)
            {
                a[0]=2; a[1]=i/10; a[2]=i%10; a[3]=0;
            }
            else
            {
                a[0]=1; a[1]=i; a[2]=0; a[3]=0;
            }
            for(j=1;j<=r[i][0];++j)
            r[i][j]=0;
            inmultire(a,r[i-1],r[i]);
        }
        inmultire(r[160],r[n],rez);
        for(i=rez[0];i>=1;--i)
        g<<rez[i];
    }
    return 0;
}