Pagini recente » Cod sursa (job #3324326) | Cod sursa (job #3324324) | Borderou de evaluare (job #3332531) | Cod sursa (job #3354765) | Cod sursa (job #3347490)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
int dp[2][1001][200],unu[200];
int cmmdc(int a,int b)
{
while(b)
{
int r=a%b;
a=b;
b=r;
}
return a;
}
int main()
{
int n,vmax=0;
fin>>n;
unu[0]=1;
unu[1]=1;
for(int i=1; i<=n; i++)
{
int x;
fin>>x;
vmax=max(vmax,x);
if(i==1)
{
for(int j=0; j<200; j++)
dp[1][x][j]=unu[j];
continue;
}
int cur=i%2;
int prv=1-cur;
for(int j=1; j<=vmax; j++)
for(int k=0; k<200; k++)
dp[cur][j][k]=dp[prv][j][k];
for(int j=1; j<=vmax; j++)
{
if(dp[prv][j][0]==0)
continue;
int d=cmmdc(x,j);
int t=0;
int nc=max(dp[cur][d][0],dp[prv][j][0]);
for(int k=1; k<=nc || t; k++)
{
int s=t;
if(k<=dp[cur][d][0])
s+=dp[cur][d][k];
if(k<=dp[prv][j][0])
s+=dp[prv][j][k];
dp[cur][d][k]=s%10;
t=s/10;
if(k>dp[cur][d][0])
dp[cur][d][0]=k;
}
}
int d=x,t=0;
int nc=max(dp[cur][d][0],1);
for(int k=1; k<=nc || t; k++)
{
int s=t;
if(k<=dp[cur][d][0])
s+=dp[cur][d][k];
if(k==1)
s+=1;
dp[cur][d][k]=s%10;
t=s/10;
if(k>dp[cur][d][0])
dp[cur][d][0]=k;
}
}
int lin=n%2;
if(dp[lin][1][0]==0)
{
fout<<0;
return 0;
}
for(int i=dp[lin][1][0]; i>=1; i--)
fout<<dp[lin][1][i];
return 0;
}