Listing Functii.PAS 
Program FunctiiSurj; 
#include <stdio.h> 
#include <string.h> 
class N { 
private: 
int c[127],n; N prod(int); 
void transp(int); void init0(); 
public: 
N (unsigned long =0); N (char *); 
N& operator+=(N&); N& operator*=(N&); 
N& operator<<=(int); 
friend N operator+(N&,N&); 
friend N operator*(N&,N&); 
friend N operator<<(N&,int); 
friend void scrie(N&,FILE*); 
}; 
N::N(unsigned long x){ 
init0(); 
for (n=0;x;n++) c[n]=x % 10, x/=10; 
} 
N::N(char* x){ 
init0(); n=strlen(x); 
for (int i=0,nn=n-1;x[i];i++) 
c[nn-i]=x[i]-'0'; 
} 
void N::init0(){ 
for (int i=0;i<128;i++) c[i]=0;n=1; 
} 
N N::prod(int x){ 
int i,t,s; N z=*this; 
for (i=t=0;i<n;i++){ 
(s=x*z.c[i]+t)>9 ? 
(t=s/10,s %=10):(t=0); 
z.c[i]=s; 
} 
z.transp(t); return z; 
} 
void N::transp(int t){ 
if(t) c[n]=t,n++; 
} 
N& N::operator+=(N& x){ 
int i,t,s;if(n<x.n) n=x.n; 
for (i=t=0;i<n;i++){ 
(s=c[i]+x.c[i]+t)>9 ? 
(t=1,s-=10):(t=0); c[i] = s; 
} 
transp(t); 
return *this; 
} 
N& N::operator*=(N& x){ 
N s; 
for (int i=0;i<x.n;i++) 
if (x.c[i]) s+=(prod(x.c[i])<<i); 
return *this=s; 
} 
N& N::operator<<=(int x){ 
if (x){ 
for (int i=n-1;i>=0;i--) c[i+x]=c[i]; 
for(i=0;i<x;i++) c[i]=0; n+= x; 
} 
return *this; 
} 
N operator+ (N& x, N& y) 
{ N z=x;z+=y; return z;} 
N operator* (N& x, N& y) 
{ N z=x;z*=y;return z;} 
N operator<<(N& x,int y) 
{ N z=x;z<<=y;return z;} 
void scrie(N& x, FILE *f){ 
for(int i = x.n - 1; i >= 0; i--) 
fprintf(f, "%d", x.c[i]); 
fputc('\n', f); 
} void main() 
{ N s[27],f[27],ss[10]; 
s[1]=f[1]=1; 
int k,n,nr=0,i,j=0,nn[10],kk[10], 
necalc[10]; 
char a[27],b[27],s0[]="0"; 
FILE *f1,*f2; 
f1=fopen("in.txt","rt"); 
f2=fopen("out.txt","wt"); 
fscanf(f1,"%s%s",a,b); 
nn[nr]=strlen(a); 
kk[nr]=strlen(b); 
if (nn[nr]>=kk[nr]) necalc[nr]=1; 
else necalc[nr]=0; 
nr++; fclose(f1); 
for (n=2;n<27;n++) { 
s[n]=1;f[n]=n*f[n-1]; 
for (k=n-1;k>1;k--) 
s[k]=s[k-1]+k*s[k]; 
for (i=0;i<nr;i++) 
if (n == nn[i] && necalc[i]) 
{ss[i]=s[kk[i]]*f[kk[i]];j++;} 
if (j == nr) break; 
} 
for(i=0;i<nr;i++) 
if (necalc[i]) scrie(ss[i],f2); 
else fprintf(f2,"%s\n",s0); 
fclose(f2); 
} 
Pentru a mări interesul pentru Java, vom prezenta o rezolvare în acest limbaj, 

propusă de Mihai Scorțaru, student, Universitatea Tehnică din Cluj: 
import java.math.*; 
import java.io.*; 
class FunctiiSurjective{ 
public static void main(String args[]){ 
try{ 
BufferedReader br=new BufferedReader 
(new InputStreamReader 
(new FileInputStream("in.txt"))); 
String s=br.readLine(); 
int x=s.length(); 
s=br.readLine(); 
int y=s.length(); 
BigInteger[] a=new BigInteger[27]; 
BigInteger[] b=new BigInteger[27]; 
for (int i=0;i<27;i++){ 
a[i]=new BigInteger("0"); 
b[i]=new BigInteger("0"); 
} 
a[1]=new BigInteger("1"); 
for (int i=2;i<=x;i++){ 
for (int j=1;j<=i;j++) 
b[i]=(a[i].multiply(new BigInteger 
(Integer.toString(j)))).add 
(a[i-1].multiply(new BigInteger 
(Integer.toString(j)))); 
for (int j=1;j<=i;j++) a[i]=b[i]; 
} 
PrintWriter pw=new PrintWriter 
(new FileOutputStream("out.txt"),true); 
pw.println(b[y]); 
} catch (IOException ioe) 
{System.out.println("IO Error");} 
} 
}