Cod sursa(job #1681866)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 9 aprilie 2016 19:28:55
Problema Indep Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#define MAXN 500
#define MAXNR 1000
int d[2][MAXNR+1][150],cif[2][MAXNR+1];
inline int cmmdc(int a,int b){
     int r;
     while(b>0){
        r=a%b;
        a=b;
        b=r;
     }
     return a;
}
inline int getmax(int a,int b){
     if(a>b) return a;
     return b;
}
int main(){
    FILE*fi,*fout;
    int i,n,nr,j,x,t,y,max;
    fi=fopen("indep.in" ,"r");
    fout=fopen("indep.out" ,"w");
    fscanf(fi,"%d" ,&n);
    max=0;
    for(i=1;i<=n;i++){
       fscanf(fi,"%d" ,&nr);
       d[i&1][nr][0]=cif[i&1][nr]=1;
       for(x=1;x<=max;x++){
           t=0;
           for(j=0;t>0||j<getmax(cif[i&1][x],cif[1-i&1][x]);j++){
               if(nr==x&&j==0)
                  t=t+d[i&1][x][j]+d[1-i&1][x][j];
               else
                  t=t+d[1-i&1][x][j];
               d[i&1][x][j]=t%10;
               t/=10;
           }
           cif[i&1][x]=j;
       }
       for(x=1;x<=max;x++){
           t=0;
           y=cmmdc(x,nr);
           for(j=0;t>0||j<getmax(cif[i&1][y],cif[1-i&1][x]);j++){
               t=t+d[i&1][y][j]+d[1-i&1][x][j];
               d[i&1][y][j]=t%10;
               t/=10;
           }
           cif[i&1][y]=j;
       }
       if(max<nr)
          max=nr;
    }
    for(i=cif[n&1][1]-1;i>=0;i--)
        fprintf(fout,"%d" ,d[n&1][1][i]);
    fclose(fi);
    fclose(fout);
    return 0;
}