Pagini recente » Cod sursa (job #1570560) | Cod sursa (job #1079743) | Cod sursa (job #2564320) | Cod sursa (job #272004) | Cod sursa (job #1557708)
#include <cstdio>
#define nmax 201
using namespace std;
typedef int Huge[1001];
FILE *fin = fopen("perm.in", "r"), *fout = fopen("perm.out", "w");
Huge s[2][nmax];
void AtribHuge(Huge H, Huge X)
{
int i;
for (i = 0; i <= X[0]; ++i) {
H[i] = X[i];
}
}
void Afis(Huge H)
{
int n = H[0];
if(!n) fprintf(fout,"0");
else
while(n)
fprintf(fout,"%d",H[n--]);
}
void Atrib(Huge H, int x)
{
H[0] = 0;
do
{
H[++H[0]] = x%10;
x/=10;
}while(x);
}
void Subtract(Huge A, Huge B)
{
int i, T=0;
for (i=B[0]+1;i<=A[0];) B[i++]=0;
for (i=1;i<=A[0];i++)
A[i]+= (T=(A[i]-=B[i]+T)<0) ? 10 : 0;
while (!A[A[0]]) A[0]--;
}
void Mult(Huge H, long X)
{
int i;
unsigned long T=0;
for (i=1;i<=H[0];i++)
{ H[i]=H[i]*X+T;
T=H[i]/10;
H[i]=H[i]%10;
}
while (T) /* Cat timp exista transport */
{ H[++H[0]]=T%10;
T/=10;
}
}
void Add(Huge A, Huge B)
/* A <- A+B */
{ int i,T=0;
if (B[0]>A[0])
{ for (i=A[0]+1;i<=B[0];) A[i++]=0;
A[0]=B[0];
}
else for (i=B[0]+1;i<=A[0];) B[i++]=0;
for (i=1;i<=A[0];i++)
{ A[i]+=B[i]+T;
T=A[i]/10;
A[i]%=10;
}
if (T) A[++A[0]]=T;
}
void stirling(int n,int m)
{
int i,j;
Atrib(s[0][1],1);
Atrib(s[0][2],1);
i=3;
while(i<=n)
{
Atrib(s[0][0], 0);
for(j=1;j<=m;j++)
{
Huge a,b;
AtribHuge(a,s[0][j-1]);
AtribHuge(b,s[0][j]);
Mult(b,(i-1));
if(j==1)
Subtract(b,a);
else
Add(b,a);
AtribHuge(s[1][j],b);
}
for(j=1;j<=m;j++)
AtribHuge(s[0][j],s[1][j]);
i++;
}
}
int main()
{
int n,m,i,j;
fscanf(fin,"%d %d",&n,&m);
stirling(n,m);
Afis(s[0][m]);
return 0;
}