Pagini recente » Cod sursa (job #2550688) | Cod sursa (job #1880527) | Cod sursa (job #1058788) | Cod sursa (job #1722201) | Cod sursa (job #2256947)
#include <fstream>
#include <vector>
#define VAL 505
#define NRV 1005
#define BASE 1000000000
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
int N, v[VAL], i, j;
int dp[2][NRV][NRV], D;
int cif[15], X;
void ADD(int cnt, int X)
{
int i, t=0, nr;
for (i=1; i<=max(dp[cnt][D][0], dp[1-cnt][X][0]); i++)
{
nr=0;
if (i<=dp[cnt][D][0])
nr+=dp[cnt][D][i];
if (i<=dp[1-cnt][X][0])
nr+=dp[1-cnt][X][i];
nr+=t;
t=nr / BASE;
nr=nr % BASE;
dp[cnt][D][i]=nr;
}
if (t==1)
dp[cnt][D][++dp[cnt][D][0]]=1;
}
void EMPTY(int cnt)
{
for (int j=1; j<NRV; j++)
{
dp[cnt][j][0]=1;
dp[cnt][j][1]=0;
}
}
int GCD(int A, int B)
{
if (B==0)
return A;
return GCD(B, A % B);
}
int main()
{
fin >> N;
for (i=1; i<=N; i++)
fin >> v[i];
dp[1][v[1]][0]=dp[1][v[1]][1]=1;
EMPTY(0);
for (i=2; i<=N; i++)
{
for (j=1; j<NRV; j++)
{
D=GCD(v[i], j);
ADD(i % 2, j);
ADD(i % 2 , D);
}
EMPTY((i+1) % 2);
}
for (i=dp[N % 2][1][0]; i>=1; i--)
{
if (i==dp[N % 2][1][0])
fout << dp[N % 2][1][i];
else
{
X=BASE / 10;
for (int j=1; j<=9; j++)
{
cif[j]=dp[N % 2][1][i] / X;
dp[N % 2][1][i]%=X;
X/=10;
}
for (j=1; j<=9; j++)
fout << cif[j];
}
}
fin.close();
fout.close();
return 0;
}