Cod sursa(job #847301)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 3 ianuarie 2013 18:01:52
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include<fstream>
using namespace std;
typedef struct { int lim, nr[501];} tip;
tip sol[505],comb[505][505],scomb,rez,ss;
int i,j,n,a[505];

void aduna(tip a, tip b){
    int s,t=0,limc=min(a.lim,b.lim),k;

    for (k=500; k>=limc; --k) {
                      s=a.nr[k]+b.nr[k]+t;
                      sol[i].nr[k]=s%10;
                      t=s/10;
                      }
    if (t>0) { --limc; sol[i].nr[limc]=t; }
    sol[i].lim=limc;
}

void aduna1(tip a, tip b){
    int s,t=0,limc=min(a.lim,b.lim),k;

    for (k=500; k>=limc; --k) {
                      s=a.nr[k]+b.nr[k]+t;
                      comb[i][j].nr[k]=s%10;
                      t=s/10;
                      }
    if (t>0) { --limc; comb[i][j].nr[limc]=t; }
    comb[i][j].lim=limc;
}

void aduna2(tip a, tip b){
    int s,t=0,limc=min(a.lim,b.lim),k;

    for (k=500; k>=limc; --k) {
                      s=a.nr[k]+b.nr[k]+t;
                      scomb.nr[k]=s%10;
                      t=s/10;
                      }
    if (t>0) { --limc; scomb.nr[limc]=t; }
    scomb.lim=limc;
}

int cmmdc(int a, int b){
    int r;
    do {
        r=a%b;
        a=b; b=r;
        } while (r!=0);
    return(a);
}

int main(void){
    ifstream fin("indep.in");
    ofstream fout("indep.out");
    fin>>n;
     for (i=1; i<=n; ++i) fin>>a[i];
    
    sol[1].lim=500; sol[0].lim=500; sol[0].nr[500]=1;
    for (i=2; i<=n; ++i){
     sol[i].lim=500;
     for (j=i-1; j>=1; --j)
      if (cmmdc(a[i],a[j])!=1){ aduna(sol[i],sol[0]); aduna(sol[i],sol[j]); }
    }
    
     comb[0][0].nr[500]=1; comb[0][0].lim=500; comb[0][1].lim=500;
    for (i=1; i<=n; ++i) {
        comb[i][0].nr[500]=1; comb[i][0].lim=500;
         for (j=1; j<=i; ++j) aduna1(comb[i-1][j-1],comb[i-1][j]);
        comb[i][j].lim=500;
          }
   
     scomb.lim=500;
    for (i=2; i<=n; ++i) aduna2(scomb,comb[n][i]);
     i=n;
     for (j=n-1; j>=1; --j) aduna(sol[i],sol[j]);    
    
    
    int t=0,llim=scomb.lim;
    for (i=500; i>=llim; --i) {
        if (t>0&&scomb.nr[i]==0) scomb.nr[i]=9;
        else if (t>0) --scomb.nr[i];
        rez.nr[i]=scomb.nr[i]-sol[n].nr[i];
        if (rez.nr[i]<0) { rez.nr[i]+=10; ++t; }
     }
     while (rez.nr[llim]==0&&llim<500) ++llim;
     for (i=llim; i<=500; ++i) fout<<rez.nr[i];
 return(0);
}