Cod sursa(job #2401190)

Utilizator TghicaGhica Tudor Tghica Data 9 aprilie 2019 14:49:34
Problema Nunta Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream cin("nunta.in");
ofstream cout("nunta.out");

short int v[1000000],s[1000000],imp[1000000];

int main()
{
    int a,b=0,n,cnt=0;
    cin>>n;
    if(n|1)
        b=1;
    a=n/2;
    while(b<=n)
    {
        v[1]=1;
        int k=1;
        for(int i=a+b;i>max(a,b);i--)
        {
            v[1]*=i;
            int l=1;
            while(v[l]>9)
            {
                l++;
                v[l]+=v[l-1]/10;
                v[l-1]%=10;
            }
            if(l>k)
                k=l;
        }
        reverse(v+1,v+k+1);
        int l;
        for(int i=2;i<=min(a,b);i++)
        {
            int nr=0;
            l=0;
            if(i%2==1)
            {
                for(int j=1;j<=k;j++)
                {
                    nr=nr*10+v[j];
                    if(nr>i)
                    {
                        l++;
                        v[l]=nr/i;
                        nr=nr%i;
                        if(v[l]>9)
                        {
                            l++;
                            v[l]=v[l-1]/10;
                            v[l-1]%=10;
                        }
                    }
                }
            }
            else
            {
                for(int j=1;j<=k;j++)
                {
                    nr=nr*10+v[j];
                    if(nr>i)
                    {
                        l++;
                        imp[l]=nr/i;
                        nr=nr%i;
                        if(imp[l]>9)
                        {
                            l++;
                            imp[l]=imp[l-1]/10;
                            imp[l-1]%=10;
                        }
                    }
                }
            }
            k=l;
        }
        if(min(a,b)%2==0 && a!=0 && b!=0)
        {
            reverse(imp+1,imp+1+k);
            for(int i=1;i<=k;i++)
            {
                s[i]+=imp[i];
                v[i]=0;
                imp[i]=0;
                if(s[i]>9)
                {
                    s[i+1]+=s[i]/10;
                    s[i]%=10;
                }
            }
            if(cnt<k)
                cnt=k;
        }
        if(min(a,b)%2==1 or a==0 or b==0)
        {
            reverse(v+1,v+1+k);
            for(int i=1;i<=k;i++)
            {
                s[i]+=v[i];
                v[i]=0;
                imp[i]=0;
                if(s[i]>9)
                {
                    s[i+1]+=s[i]/10;
                    s[i]%=10;
                }
            }
            if(cnt<k)
                cnt=k;
        }
        a--;
        b+=2;
    }
    for(int i=cnt;i>=1;i--)
        cout<<s[i];
    return 0;
}