Cod sursa(job #1829206)

Utilizator 1475369147896537415369Andrei Udriste 1475369147896537415369 Data 14 decembrie 2016 16:12:09
Problema Patrate2 Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<stdio.h>
#include<stdlib.h>

int DoiLaNPatrat[1000] = {1, 1};
int NFactorial[1000] = {1, 1};

//------------------------------------------------------
void ScalarMultiply(int A[], int x){

int i, t = 0;

for (i = 1; i <=A[0] || t; i++, t /= 10000){
   A[i] = (t += A[i] * x) % 10000;
}
A[0] = i - 1;
}
//------------------------------------------------------
void HugeMultiply(int A[], int B[]) {

int i, j, t, C[1000];
memset(C, 0, sizeof(C));

for (i = 1; i <= A[0]; i++){
    for (t=0, j=1; j <= B[0] || t; j++, t/=10000){
        C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10000;
    }
}
if(i + j - 2 > C[0]){
    C[0] = i + j - 2;
}
memcpy(A, C, sizeof(C));
}
//------------------------------------------------------
int main(){

FILE *file1, *file2;
int N, i;

file1 = fopen("patrate2.in", "r");
file2 = fopen("patrate2.out", "w");

fscanf(file1, "%d", &N);

for(i=2; i<=N; i++){
    ScalarMultiply(NFactorial, i);
}
for(i=1; i<=N*N; i++){
    ScalarMultiply(DoiLaNPatrat, 2);
}
HugeMultiply(NFactorial, DoiLaNPatrat);

for(i=NFactorial[0]; i>0; i--){
    if(i!=NFactorial[0]){
        if(!(NFactorial[i]/10)){
            fprintf(file2, "000");
        }else if(!(NFactorial[i]/100)){
            fprintf(file2, "00");
        }else if(!(NFactorial[i]/1000)){
            fprintf(file2, "0");
        }
    }
    fprintf(file2, "%d", NFactorial[i]);
}
return 0;
}