Cod sursa(job #393486)

Utilizator freak93Adrian Budau freak93 Data 9 februarie 2010 15:24:24
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<fstream>

using namespace std;

const char iname[]="indep.in";
const char oname[]="indep.out";
const int maxn=1005;
const int maxl=350;

ifstream f(iname);
ofstream g(oname);

void add(int A[], int 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;
}

void sub(int A[], int B[])
{
      int i, t = 0;
      for (i = 1; i <= A[0]; i++)
              A[i] += (t = (A[i] -= B[i] + t) < 0) * 10;
      for (; A[0] > 1 && !A[A[0]]; A[0]--);
}

int d[maxn],i,j,n,z[maxn][maxl],a[maxn],p[maxn],ans[maxl];

int main()
{
    f>>n;
    for(i=1;i<=n;++i)
        f>>a[i];
    for(i=1;i<=1000;++i)
        for(j=1;j<=n;++j)
            if(a[j]%i==0)
                ++d[i];

    for(i=2;i<=1000;++i)
        if(p[i]==0)
        {
            for(j=i*i;j<=1000;j+=i*i)
                p[j]=-1;
            for(j=i;j<=1000;j+=i)
                if(p[j]!=-1)
                    ++p[j];
        }

    z[0][0]=1;
    z[1][1]=z[1][0]=1;
    for(i=2;i<=1000;++i)
        add(z[i],z[i-1]),add(z[i],z[i-1]),add(z[i],z[1]);

    ans[0]=1;
    for(i=1;i<=1000;++i)
        if(p[i]!=-1)
            if(p[i]&1)
                sub(ans,z[d[i]]);
            else
                add(ans,z[d[i]]);

    for(i=ans[0];i;--i)
        g<<ans[i];
    g<<"\n";

    f.close();
    g.close();

    return 0;
}