Pagini recente » Cod sursa (job #2174311) | Cod sursa (job #622084) | Cod sursa (job #1770960) | Cod sursa (job #1677733) | Cod sursa (job #551272)
Cod sursa(job #551272)
#include <fstream>
#include <iostream>
# define DIM 1024
# define B 1000000000
using namespace std;
int n, v[DIM], d[2][DIM][DIM], nmax;
void read ()
{
ifstream fin ("indep.in");
fin>>n;
for(int i=1;i<=n;++i)
{
fin>>v[i];
if (v[i]>nmax)
nmax=v[i];
}
}
void aduna (int s[], int a[])
{
int q, t=0, ui=s[0];
if (s[0]<a[0])for(int i=s[0]+1;i<=a[0];++i)s[i]=0;
if (a[0]<s[0])for(int i=a[0]+1;i<=s[0];++i)a[i]=0;
for(int i=1;i<=s[0] || i<=a[0];++i)
{
q=s[i]+a[i]+t;
s[i]=q%B;
t=q/B;
ui=i;
}
s[0]=ui;
while (t)
{
s[++s[0]]=t%B;
t/=B;
}
}
int cmmdc (int x, int y)
{
int r;
do{
r=x%y;
x=y;
y=r;
}
while (r);
return x;
}
void din ()
{
int p=1, dc;
d[1][v[1]][1]=d[1][v[1]][0]=1;
for(int i=2;i<=n;++i)
{
p=1-p;
for(int j=1;j<=nmax;++j)
d[p][j][0]=0;
d[p][v[i]][0]=d[p][v[i]][1]=1;
for(int j=1;j<=nmax;++j)
{
dc=cmmdc(v[i],j);
aduna(d[p][dc],d[1-p][j]);
aduna(d[p][j],d[1-p][j]);
}
}
}
void write ()
{
ofstream fout ("indep.out");
if (n==1)
{
if (v[1]==1)fout<<"1";
else fout<<"0";
}
else
{
fout<<d[n%2][1][d[n%2][1][0]];
for(int i=d[n%2][1][0]-1;i;--i)
{
int x;
x=d[n%2][1][i];
while (x*10<B)
{
fout<<"0";
x*=10;
}
fout<<d[n%2][1][i];
}
}
}
int main ()
{
read ();
din();
write ();
return 0;
}