Cod sursa(job #2089874)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 17 decembrie 2017 12:22:56
Problema Indep Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("indep.in");
ofstream g("indep.out");
int n,v[502];
int mat[3][1002][1002];
int l[3][1002];
int maxgcd[1002];
int gcd(int a, int b)
{
    while(b)
    {
        int c=a%b;
        a=b;
        b=c;
    }
    return a;
}
void ipar(int nr)
{
    memset(mat[2],0,sizeof(mat[2]));
    memset(l[2],0,sizeof(l[2]));
    for(int i=1;i<=1000;++i){
        int cd=gcd(i,nr);
        if(l[1][i]){
            for(int j=1;j<=l[1][i];++j)
                mat[2][i][j]+=mat[1][i][j];
            l[2][i]=max(l[2][i],l[1][i]);
            for(int j=1;j<=l[1][i];++j)
                mat[2][cd][j]+=mat[1][i][j];
            l[2][cd]=max(l[2][cd],l[1][i]);
        }
    }
    l[2][nr]=max(l[2][nr],1);
    mat[2][nr][1]++;
    for(int i=1;i<=1000;++i){
        for(int j=1;j<=l[2][i];++j)
        {
            mat[2][i][j+1]+=mat[2][i][j]/10;
            mat[2][i][j]%=10;
            if(mat[2][i][j+1] && j==l[2][i])
                ++l[2][i];
        }
    }
}
void impar(int nr)
{
    memset(mat[1],0,sizeof(mat[1]));
    memset(l[1],0,sizeof(l[1]));
    for(int i=1;i<=1000;++i){
        int cd=gcd(i,nr);
        if(l[2][i]){
            for(int j=1;j<=l[2][i];++j)
                mat[1][i][j]+=mat[2][i][j];
            l[1][i]=max(l[1][i],l[2][i]);
            for(int j=1;j<=l[2][i];++j)
                mat[1][cd][j]+=mat[2][i][j];
            l[1][cd]=max(l[1][cd],l[2][i]);
        }
    }
    l[1][nr]=max(l[1][nr],1);
    mat[1][nr][1]++;
    for(int i=1;i<=1000;++i){
        for(int j=1;j<=l[1][i];++j)
        {
            mat[1][i][j+1]+=mat[1][i][j]/10;
            mat[1][i][j]%=10;
            if(mat[1][i][j+1] && j==l[1][i])
                ++l[1][i];
        }
    }
}
int main()
{
    f>>n;
    for(int i=1;i<=n;++i)
        f>>v[i];
    mat[1][v[1]][1]=1;
    l[1][v[1]]=1;
    for(int i=2;i<=n;++i)
    {
        if(i%2==0)
            ipar(v[i]);
        else
            impar(v[i]);
    }
    if(n%2==0)
        for(int j=l[2][1];j>=1;--j)
            g<<mat[2][1][j];
    else
        for(int j=l[1][1];j>=1;--j)
            g<<mat[1][1][j];
    return 0;
}