Cod sursa(job #2102325)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 8 ianuarie 2018 17:47:35
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <cstring>
#include <iostream>
#define BAZA 1000000000
#define MAXN 1001
typedef int HUGE[150];
HUGE d[2][MAXN],one={1,1};
inline int cmmdc(int a,int b)
{
    int r;
    while(b)
    {
        r=a%b;
        a=b;b=r;
    }
    return a;
}
inline void add(HUGE a,HUGE b)
{
    int t=0;
    a[0]=std::max(a[0],b[0]);
    for(int i=1;i<=a[0];i++)
    {
        a[i]+=b[i]+t;
        t=a[i]/BAZA;a[i]%=BAZA;
    }
    if(t)
        a[++a[0]]=t;
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("indep.in","r");
    fout=fopen("indep.out","w");
    int n,x,r=1;
    fscanf(fin,"%d%d",&n,&x);
    d[0][x][0]=d[0][x][1]=1;
    for(int i=1;i<n;i++)
    {
        fscanf(fin,"%d",&x);
        for(int j=1;j<MAXN;j++)
        {
            memset(d[r][j],0,sizeof(d[r][j]));
            add(d[r][j],d[1-r][j]);
            add(d[r][cmmdc(j,x)],d[1-r][j]);
        }
        add(d[r][x],one);
        r=1-r;
    }
    r=1-r;
    fprintf(fout,"%d",d[r][1][d[r][1][0]]);
    for(int i=d[r][1][0]-1;i>0;i--)
        fprintf(fout,"%.9d",d[r][1][i]);
    fclose(fin);
    fclose(fout);
    return 0;
}