Cod sursa(job #2982077)

Utilizator Darius1414Dobre Darius Adrian Darius1414 Data 19 februarie 2023 15:12:44
Problema Indep Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define nmx 505
using namespace std;
int n,x,v[nmx],dp[nmx][nmx][16],fprm[nmx][5],ctp[nmx];
void prim(int x,int i)
{
    int d=2,ct=0;
    while (x!=1)
    {
        if (x%d==0)
        {
            fprm[i][++ct]=d;
            while (x%d==0)
                x/=d;
        }
        if (d==2)
            d++;
        else
            d+=2;
        if (d*d>x && x!=1)
            d=x;
    }
    ctp[i]=ct;
}
int main()
{
    ifstream f ("indep.in");
    ofstream g ("indep.out");
    f>>n;
    for (int i=1; i<=n; i++)
    {
        f>>v[i];
        x=v[i];
        prim(x,i);
        ctp[i]=pow(2,ctp[i])-1;
    }
    for (int i=1; i<=n; i++)
    {
        dp[i][i][ctp[i]]=1;
        for (int j=i+1; j<=n; j++)
        {
            int p=0,put2=1;
            for (int l=1; fprm[i][l]!=0; l++)
            {
                if (v[j]%fprm[i][l]==0)
                    p+=put2;
                put2*=2;
            }
            for (int l=1; l<=ctp[i]; l++)
                if (l<=p && (l)&(p)==l)
                {
                    if (dp[i][j-1][l]==0)
                        dp[i][j-1][l]=1;
                    dp[i][j][l]=2*dp[i][j-1][l];
                }
        }
    }
    unsigned long long rsp=pow(2,n)-1;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=ctp[i]; j++)
            rsp-=dp[i][n][j];
    g<<rsp;
}