Cod sursa(job #2105032)

Utilizator Steve_ITStefan Ursache Steve_IT Data 12 ianuarie 2018 15:31:50
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>

using namespace std;

ifstream f("patrate2.in");
ofstream g("patrate2.out");

typedef int nrmare[5010];
void produsMic(nrmare a, int x) {
    int i, t = 0;
    for(i=1; i<=a[0]; i++, t/=10) {
        t+=x*a[i];
        a[i]=t%10;
    }
    while(t) {
        a[++a[0]] = t%10;
        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];
}
nrmare a, b;
int n, i;

int main()
{
    f>>n; a[0]=a[1]=1;
    for(i=n; i>=1; i--)
        produsMic(a, i);
    n*=n;
    b[0] = 1; b[1] = 2;
    while(n>0) {
        if(n%2 == 1) {
            n--;
            produsMare(a, b);
        }
        else {
            n/=2;
            produsMare(b, b);
        }
    }
    for(i=1; i<=a[0]; i++)
        g<<a[a[0]-i+1];
    g<<'\n';
    return 0;
}