Cod sursa(job #187656)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 4 mai 2008 23:13:18
Problema Sarpe Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 3010
#define CIF 1000100
int att[CIF],N[MAX],two[CIF],nm1[MAX],nm2[MAX],auxi[MAX];
void copy(int A[],int b){
     A[0]=1;
     A[1]=b;
}
void print(int A[]){
     int i;
     for (i=A[0];i>=1;--i)
         printf("%d",A[i]);
     printf("\n");
}
void sub(int A[], int B[]){
      int i, t = 0;
      for (i = 1; i <= A[0]; i++)
              A[i] += (t = (A[i] -= B[i] + t) < 0) * 10;
      for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
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 cp(int A[],int B[],int c){
     int i;
     int AUX[MAX];
     A[0]=B[0];
     for (i=1;i<=B[0];++i)
         A[i]=B[i];
     copy(AUX,c);
     //print(A);
     //print(AUX);
     sub(A,AUX);     
     //print(A);
}
void mul1(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 mul2(int A[], int B[]){
      int i, j, t, C[MAX];
      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));
}
int unu (int A[]){
    if (A[0]==1 && A[1]==1){
       printf("2\n");
       return 1;
    }
    return 0;
}
int main(){
    char s[MAX];
    int i,x;
    freopen("sarpe.in","r",stdin);
    freopen("sarpe.out","w",stdout);
    gets(s);
    x=strlen(s);
    for (i=x-1;i>=0;--i)
        N[++N[0]]=s[i]-'0';
    if (unu(N))
       exit(0);
    //print(N);
    //copy(att,4);
    cp(nm1,N,1);
    cp(nm2,N,2);
    copy(two,2);
    mul2(two,nm1);
    mul2(two,nm2);
    //print(two);
    copy(att,1);
    mul2(att,N);
    copy(auxi,4);
    mul2(att,auxi);
    add(att,two);
    print(att);
    //print(nm1);
    //print(nm2);
    /*fclose(stdin);
    int n;
    freopen("sarpe.in","r",stdin);
    scanf("%d",&n);
    printf("%lld",(long long)4*n+(long long )2*(n-1)*(n-2));
    */
    exit(0);
}