Pagini recente » Cod sursa (job #764035) | Cod sursa (job #927105) | Cod sursa (job #3270368) | Cod sursa (job #1671360) | Cod sursa (job #500282)
Cod sursa(job #500282)
// mat[i][j]=cate subsiruri se pot forma din primele i cu cmmdc j
#include<cstdio>
const int N=505;
int n,a[N],mat[N][2*N][50],vector1[2];
void citire()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;++i)
scanf("%d",&a[i]);
}
int cmmdc(int x,int y)
{
int r;
while (y)
{
r=x%y;
x=y;
y=r;
}
return x;
}
void suma(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 dinamica()
{
int x;
mat[1][a[1]][1]=1;
mat[1][a[1]][0]=1;
vector1[0]=1;
vector1[1]=1;
for (int i=2;i<=n;++i)
{
for (int j=1;j<=1000;++j)
{
if (mat[i-1][j][0]==0)
continue;
x=cmmdc(j,a[i]);
suma(mat[i][x],mat[i-1][j]);
}
suma(mat[i][a[i]],vector1);
for(int j=1;j<=1000;++j)
suma(mat[i][j],mat[i-1][j]);
}
for (int i=mat[n][1][0];i>0;--i)
printf("%d\n",mat[n][1][i]);
}
int main()
{
citire();
dinamica();
return 0;
}