Pagini recente » Cod sursa (job #2098981) | Cod sursa (job #3037879) | Cod sursa (job #1795718) | Problema satisfiabilităţii formulelor logice de ordinul doi | Cod sursa (job #126502)
Cod sursa(job #126502)
#include <stdio.h>
int n,a[600],b[2][1100][400],m,c[400],cm,x;
int cmmdc( int a, int b)
{
int r;
if (a==0)
return b;
if (b==0)
return a;
r=a%b;
while (r!=0)
{
a=b;
b=r;
r=a%b;
}
return b;
}
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;
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
int i,j,p = 1;
scanf("%d",&n);
for (i=1; i<=n; ++i)
{
scanf("%d",&a[i]);
if (m<a[i]) m=a[i];
}
if (n==1)
{
if (a[1]!=1) printf("0\n");
else printf("1\n");
return 0;
}
b[p^1][a[1]][0]=1;
b[p^1][a[1]][1]=1;
for (i=2; i<=n; i++)
{
for (j=0; j<=m; j++)
{
for (int k=1; k<=b[p][j][0]; k++)
{
b[p][j][k] = 0;
}
b[p][j][0] = 0;
}
b[p][a[i]][0]=1;
b[p][a[i]][1]=1;
for (j=0; j<=m; j++)
{
cm=cmmdc(j,a[i]);
add(b[p][j],b[p^1][j]);
//b[i][j]+=b[i-1][j];
add(b[p][cm],b[p^1][j]);
//b[i][cm]+=b[i-1][j];
}
p ^= 1;
}
for (i=b[p^1][1][0]; i>0; --i) printf("%d",b[p^1][1][i]);
//printf("%d",b[n][1]);
return 0;
}