Pagini recente » Cod sursa (job #444222) | Cod sursa (job #1253803) | Cod sursa (job #2988234) | Cod sursa (job #3150026) | Cod sursa (job #1295188)
#include <cstdio>
using namespace std;
const int NMAX = 510, ValMAX = 1010, DMAX = 300;
int N, V[NMAX], Dp[2][ValMAX][DMAX], Current, Next, One[DMAX];
void Add(int A[DMAX], int B[DMAX])
{
int i, T = 0;
for(i = 1; i <= A[0] || i <= B[0] || T; i ++, T /= 10)
{
T += A[i] + B[i];
A[i] = T % 10;
}
A[0] = i - 1;
}
int GCD(int A, int B)
{
if(!B) return A;
return GCD(B, A % B);
}
int main()
{
freopen("indep.in", "r", stdin);
freopen("indep.out", "w", stdout);
scanf("%i", &N);
for(int i = 1; i <= N; ++ i)
scanf("%i", &V[i]);
Dp[0][0][0] = Dp[0][0][1] = 1;
One[0] = One[1] = 1;
Current = 0; Next = 1;
for(int i = 0; i < N; ++ i)
{
for(int j = 0; j < ValMAX; ++ j)
{
Add(Dp[Next][j], Dp[Current][j]);
Add(Dp[Next][ GCD(j, V[i + 1]) ], Dp[Current][j]);
Dp[Current][j][0] = 1;
for(int k = 1; k < DMAX; ++ k)
Dp[Current][j][k] = 0;
}
Current ^= 1;
Next ^= 1;
}
for(int i = Dp[Current][1][0]; i >= 1; -- i)
printf("%i", Dp[Current][1][i]);
}