Pagini recente » Cod sursa (job #1161171) | Cod sursa (job #3273242) | Cod sursa (job #1934062) | Cod sursa (job #2742106) | Cod sursa (job #3240)
Cod sursa(job #3240)
// complexitate O(n^2)*(operatii numere mari)
#include <cstdio>
#include <string>
#define maxn 128
#define maxN 192
int n;
int A[maxn][maxn][maxN], fact[maxn][maxN];
void citire()
{
freopen("race.in", "r", stdin);
scanf("%d\n", &n);
}
void add(int A[], int B[])
{
int i, t = 0;
for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
A[i] = (t += A[i] + B[i]) % 10;
A[0] = i - 1;
}
void mul(int A[], int B)
{
int i, t = 0;
for (i = 1; i <= A[0] || t; i++, t /= 10)
A[i] = (t += A[i] * B) % 10;
A[0] = i - 1;
}
void mul(int A[], int B[])
{
int i, j, t, C[maxN];
memset(C, 0, sizeof(C));
for (i = 1; i <= A[0]; i++)
{
for (t=0, j=1; j <= B[0] || t; j++, t/=10)
C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
if (i + j - 2 > C[0]) C[0] = i + j - 2;
}
memcpy(A, C, sizeof(C));
}
void calc_fact(int k)
{
int i;
fact[1][0]=1;
fact[1][1]=1;
for(i=2;i<=k;i++)
{
memcpy(fact[i], fact[i-1], sizeof(fact[i-1]));
mul(fact[i], i);
}
}
void dp() // Dynamic Programing :D
{
int i, j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
A[i][j][0]=0;
if(j==1 || j==i) {A[i][j][0]=1; A[i][j][1]=1;}
else
{
int x[maxN];
memcpy(x, A[i-1][j], sizeof(A[i-1][j]));
mul(x, j);
add(x, A[i-1][j-1]);
memcpy(A[i][j], x, sizeof(x));
}
}
}
int main()
{
//citire();
n=100;
dp();
calc_fact(n+1);
int i, j, k;
int sum[maxN];
memset(sum, 0, sizeof(sum));
for(i=1;i<=n;i++)
{
int x[maxN];
memcpy(x, A[n][i], sizeof(A[n][i]));
mul(x, fact[i]);
add(sum, x);
}
freopen("adunare.out", "w", stdout);
for(i=sum[0];i>0;i--) printf("%d", sum[i]);
printf("\n");
return 0;
}