Cod sursa(job #2069831)

Utilizator Steve_ITStefan Ursache Steve_IT Data 18 noiembrie 2017 21:01:11
Problema Patrate2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
using namespace std;
ifstream f("patrate2.in");
ofstream g("patrate2.out");
typedef int NrMare[100010];
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];
}

int n, i, k;
NrMare v,a,b;
int main()
{
    f>>n;
    v[0]=1, v[1]=1;
    for (i=2; i<=n; i++) ProdusMic(v,i); // v=n!
    n*=n;
    a[0]=a[1]=1; b[0]=1, b[1]=2;
    while (n) {
        if (n%2) {
            ProdusMare(a,b); n--;
        }
        else {
            ProdusMare(b,b); n/=2;
        }
    }
    ProdusMare(v,a);