Pagini recente » Cod sursa (job #3176218) | Lot 2017 | Cod sursa (job #1648235) | Cod sursa (job #2592787) | Cod sursa (job #3209199)
#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;
}