Cod sursa(job #257166)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 12 februarie 2009 21:09:14
Problema Indep Scor 5
Compilator c Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <string.h>
#define LMAX 1000
typedef int Huge[LMAX];
int N,a[505],VMAX;
Huge nr[2][1001];
int cmmdc(int a,int b){
    return b==0?a:cmmdc(b,a%b);
    }
void add(Huge A,Huge 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;
     }
int main(){
    int i,j,k,now=0,prev;
    char u[1001];
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);
    scanf("%d",&N);
    for (i=1;i<=N;++i) {scanf("%d",&a[i]);
                        VMAX=VMAX<a[i]?a[i]:VMAX;} 
    for (i=1;i<=VMAX;++i)
     nr[now][i][0]=1;
    Huge unu;
    memset(unu,0,sizeof(unu));
    unu[1]=unu[0]=1;
    for (i=1;i<=N;++i){
      now=i&1;prev=1-now;
      memset(u,0,sizeof(u));
      for (j=1;j<=VMAX;++j){
        memset(nr[now][j],0,sizeof(nr[now][j]));
        nr[now][j][0]=1;}
      for (j=1;j<=VMAX;++j){
        k=cmmdc(j,a[i]);
        if (!u[k]) {
            add(nr[now][k],nr[prev][k]);
            u[k]=1;}
           }
       for (j=1;j<i;++j)
        add(nr[prev][a[j]],unu);
       for (j=1;j<=VMAX;++j){
        k=cmmdc(j,a[i]); 
        add(nr[now][k],nr[prev][j]);
        }
      }
    for (i=nr[now][1][0];i;i--) printf("%d",nr[now][1][i]);
    return 0;
}