Pagini recente » Cod sursa (job #12673) | Cod sursa (job #1601200) | Cod sursa (job #1611928) | Cod sursa (job #1211460) | Cod sursa (job #1637089)
#include <cstdio>
#include <cstring>
#define NMAX 1001
#define max(a,b) (a>b?a:b)
#define MOD 1000000000
using namespace std;
int n,M,i,c,j;
int a[NMAX];
unsigned int vec1[2*NMAX];
int mat[NMAX][NMAX];
unsigned int cnt[NMAX][2*NMAX];
int cmmdc(int a,int b)
{
int r=0;
while(a>0)
{
r=b%a;
b=a;
a=r;
}
return b;
}
int lg,ok;
void aduna(unsigned int C[],unsigned int A[])
{
int i,t=0;
lg=max(A[0],C[0]);
C[0]=lg;
for(i=1;i<=lg;++i)
{
int aux=C[i];
C[i] = (A[i] + aux + t);
if(C[i] > MOD) C[i]-=MOD;
t=(A[i]+aux+t) / MOD;
}
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&a[i]);
M=max(a[i],M);
}
cnt[a[1]][0]=1;cnt[a[1]][1]=1;
vec1[0]=1;vec1[1]=1;
for(i=2;i<=n;++i)
{
for(j=1;j<=M;++j)
{
if(mat[j][a[i]] != 0) c=mat[j][a[i]];
else
{
c=cmmdc(j,a[i]);
mat[j][a[i]]=c;
mat[a[i]][j]=c;
}
if(cnt[j][0]) aduna(cnt[c],cnt[j]);
}
aduna(cnt[a[i]],vec1);
}
lg=cnt[1][0];
for(i=lg;i>=1;--i)
printf("%d",cnt[1][i]);
if(lg == 0) printf("0\n");
return 0;
}