Pagini recente » Cod sursa (job #1865718) | Atasamentele paginii simulareeeee | Istoria paginii utilizator/rudolf | Cod sursa (job #1036563) | Cod sursa (job #878045)
Cod sursa(job #878045)
#include <fstream>
using namespace std;
//Deschiderea fisierelor de intrare si iesire
ifstream fin("patrate2.in");
ofstream fout("patrate2.out");
#define lungime 4011
//Un numar mare
struct mare
{
int v[lungime];
};
//Operatiile cu numere mari sunt implementate mai jos. Ele sunt explicate pe larg in rezolvarea problemei Tort
void init(mare &a)
{
int i;
for(i=0;i<lungime;i++)
a.v[i]=0;
}
mare produs(mare &a,mare &b)
{
mare aux;
init(aux);
aux.v[0]=a.v[0]+b.v[0];
int i,j;
for(i=1;i<=a.v[0];i++)
for(j=1;j<=b.v[0];j++)
aux.v[i+j-1]+=(a.v[i]*b.v[j]);
for(i=1;i<=aux.v[0];i++)
{
aux.v[i+1]+=(aux.v[i]/10);
aux.v[i]%=10;
}
while(aux.v[aux.v[0]]==0)
aux.v[0]--;
return aux;
}
mare produs(mare &a,int n)
{
mare aux;
init(aux);
aux.v[0]=a.v[0];
int i;
for(i=1;i<=aux.v[0];i++)
{
aux.v[i]=a.v[i]*n;
}
for(i=1;i<=aux.v[0];i++)
{
aux.v[i+1]+=(aux.v[i]/10);
aux.v[i]%=10;
}
while(aux.v[aux.v[0]+1]!=0)
{
aux.v[0]++;
aux.v[aux.v[0]+1]+=aux.v[aux.v[0]]/10;
aux.v[aux.v[0]]%=10;
}
return aux;
}
void afis(mare &a)
{
int i;
for(i=a.v[0];i>=1;i--)
{
fout<<a.v[i];
}
fout<<'\n';
}
mare int_to_mare(int x)
{
mare aux;
init(aux);
while(x>0)
{
aux.v[++aux.v[0]]=x%10;
x/=10;
}
return aux;
}
//Exponentierea logaritmica
mare putere(int baza,int exp)
{
if(exp==0)
{
mare aux;
init(aux);
aux.v[0]=1;
aux.v[1]=1;
return aux;
}
else if(exp==1)
{
return int_to_mare(baza);
}
else if(exp%2==0)
{
mare aux;
init(aux);
aux=putere(baza,exp/2);
return produs(aux,aux);
}
else
{
mare aux;
init(aux);
aux=putere(baza,exp-1);
return produs(aux,baza);
}
}
//Factorialul unui numar
mare factorial(int x)
{
mare aux;
init(aux);
aux.v[0]=1;
aux.v[1]=1;
int i;
for(i=2;i<=x;i++)
{
aux=produs(aux,i);
}
return aux;
}
int main()
{
//Se declara si citeste latura matricei
int n;
fin>>n;
//Se declara doua numare mari f - factorial si p - putere
mare f,p;
//Problema se rezolva printr-o observatie matematica - numarul de metode de a completa matricea este n!*2^(n^2)
f=factorial(n);
init(p);
n*=n;
p=putere(2,n);
mare raspuns;
init(raspuns);
raspuns=produs(f,p);
//Se afiseaza raspunsul
afis(raspuns);
//Inchiderea fisierelor de intrare si iesire
fin.close();
fout.close();
return 0;
}