Cod sursa(job #1660385)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 23 martie 2016 01:02:45
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <algorithm>
#define vmax 1005
using namespace std;
int n,g[vmax][vmax];
int d[vmax][vmax],s[vmax][vmax];

int gcd(int i,int j)
{
    if (j==0)
        return i;
    if (g[i][j])
        return g[i][j];
    return gcd(j,i%j);
}
void calculategcd()
{
    int i,j;
    for (i=1;i<vmax;i++)
        for (j=1;j<=i;j++) {
            g[i][j]=gcd(i,j);
            g[j][i]=g[i][j];
        }
}
void sum(int a[],int b[])
{
    int i;
    a[0]=max(a[0],b[0]);
    for (i=1;i<=b[0];i++) {
        a[i]+=b[i];
    }
    a[0]++;
    for (i=1;i<=a[0];i++)
        if (a[i]>9) {
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
    if (a[a[0]]==0)
        a[0]--;
}
void clearing(int a[])
{
    int i;
    for (i=a[0];i>=0;i--)
        a[i]=0;
}
int main()
{
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);
    scanf("%d",&n);
    int i,j,a;
    calculategcd();
    for (i=1;i<=n;i++) {
        scanf("%d",&a);
        d[a][0]=d[a][1]=1;
        for (j=0;j<vmax;j++)
            sum(d[g[j][a]],s[j]);
        for (j=0;j<vmax;j++) {
            sum(s[j],d[j]);
            clearing(d[j]);
        }
    }
    for (i=s[1][0];i>=1;i--)
        printf("%d",s[1][i]);
    if (s[1][0]==0)
        printf("0\n");
    return 0;
}