Pagini recente » Profil John_Kappa | Profil eudanip | Cod sursa (job #283787) | Cod sursa (job #1609640) | Cod sursa (job #208145)
Cod sursa(job #208145)
#include<stdio.h>
#include<string>
using namespace std;
#define MAXL (1<<11)
int nfact[MAXL];
int lanp2[MAXL];
int rezultat[(MAXL<<1)];
void inmult(int fa){
int i,t;
for(i=1,t=0;i<=nfact[0]||t;i++,t/=100000)
nfact[i]=(t+=nfact[i]*fa)%100000;
nfact[0]=i-1;
}
void fact(int n){
int i;
nfact[0]=1;nfact[1]=1;
for(i=2;i<=n;i++)
inmult(i);
}
/*void inm(){
int i, t;
for(i=1,t=0;i<=lanp2[0]||t;i++,t/=10)
lanp2[i]=(t+=(lanp2[i]<<1))%10;
lanp2[0]=i-1;
}
void ridic(int p){
int i;
lanp2[0]=1;lanp2[1]=2;
for(i=1;i<p;i++)
inm();
} */
int sir[MAXL];
int C[MAXL];
void inmulteste(int A[], int B[]){
int i, j, t;
memset(C,0,sizeof(C));
for(i=1;i<=A[0];i++){
for(j=1,t=0;j<=B[0]||t;j++,t/=100000){
C[i-1+j]=(t+=A[i]*B[j]+C[i-1+j])%100000;
}
}
C[0]=i+j-3;
memcpy(A,C,sizeof(C));
}
void ridic(int p){
int i;
lanp2[0]=1;lanp2[1]=2;
sir[0]=1;sir[1]=2;
p--;
while(p){
if((p&1)){
inmulteste(lanp2,sir);
}
inmulteste(sir,sir);
p>>=1;
}
}
void inmultiremare(){
int i, j,t;
for(i=1;i<=nfact[0];i++){
for(j=1,t=0;j<=lanp2[0]||t;j++,t/=100000){
rezultat[i-1+j]=(t+=nfact[i]*lanp2[j]+rezultat[i-1+j])%100000;
}
}
rezultat[0]=i+j-3;
}
int main(){
int n;
freopen("patrate2.in","r",stdin);
freopen("patrate2.out","w",stdout);
scanf("%d", &n);
fact(n);
ridic(n*n);
inmultiremare();
int i;
printf("%d",rezultat[rezultat[0]]);
for(i=rezultat[0]-1;i>0;i--)
printf("%05d",rezultat[i]);
printf("\n");
return 0;
}