Cod sursa(job #3209199)

Utilizator Maftei_TudorMaftei Tudor Maftei_Tudor Data 2 martie 2024 10:42:05
Problema Patrate2 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <iostream>
#include <cstdio>

using namespace std;
typedef int NrMare[10005];

NrMare ans, aux, fact;

void Adunare(NrMare x,NrMare y)
// x = x + y
{
  int i,t=0;
  if(x[0]<y[0])
    x[0]=y[0];
  for(i=1;i<=x[0];i++,t/=10)
  {
    t=x[i]+y[i]+t;
    x[i]=t%10;
    // echivalent x[i]=(t+=x[i]+y[i])%10
  }
  if(t)
    x[++x[0]]=t;
}
void ProdusMic(NrMare x, int n)
{
  int i,t=0;
  for(i=1;i<=x[0];i++,t/=10)
  {
    t+=x[i]*n;
    x[i]=t%10;
  }
  for(;t;t/=10)
    x[++x[0]]=t%10;
}
void ProdusMare(NrMare x, NrMare y)
//x = x * y
{
  int i,j,t=0;
  NrMare z;
  //stabilim lungimea rezultatului. S-ar putea modifica
  z[0]=x[0]+y[0]-1;
  //initializez vectorul z
  for(i=1;i<=x[0]+y[0];i++)
    z[i]=0;
  //calculez produsele intermediare, impreuna cu suma intermediara
  for(i=1;i<=x[0];i++)
    for(j=1;j<=y[0];j++)
      z[i+j-1]+=x[i]*y[j];
  //corectez sumele intermediare
  for(i=1;i<=z[0];i++)
  {
    t+=z[i];
    z[i]=t%10;
    t/=10;
  }
  if(t)
    z[++z[0]]=t;
  // pun rezultatul in x
  for(i=0;i<=z[0];i++)
    x[i]=z[i];
}
void Divide(NrMare x, int n)
//x = x /n, returneaza x%n
{
  int i,r=0;
  for(i=x[0];i>0;i--)
  {
    r=10*r+x[i];
    x[i]=r/n;
    r%=n;
  }
  for(;x[x[0]]==0 && x[0]>1;)
    x[0]--;
}
void binpow(NrMare rez, NrMare exp) {
    rez[0] = rez[1] = 1;
    aux[0] = 1;
    aux[1] = 2;
    while(exp[1]) {
        if(exp[exp[0]] & 1)
            ProdusMare(rez, aux);

        ProdusMare(aux, aux);
        Divide(exp, 2);
    }
}

int main()
{
    freopen("patrate2.in", "r", stdin);
    freopen("patrate2.out", "w", stdout);
    cin.tie(nullptr)->sync_with_stdio(0);

    int n;
    cin >> n;
    fact[0] = fact[1] = 1;
    for(int i=2; i<=n; i++)
        ProdusMic(fact, i);
    binpow(ans, fact);
    fact[0] = fact[1] = 1;
    for(int i=2; i<=n; i++)
        ProdusMic(fact, i);
    ProdusMare(ans, fact);
    for(int i=1; i<=n*n-n; i++)
        ProdusMic(ans, 2);

    for(int i=ans[0]; i>=1; i--)
        cout << ans[i];
    return 0;
}