Pagini recente » Cod sursa (job #1194050) | Cod sursa (job #1900922) | Cod sursa (job #912947) | Cod sursa (job #2286344) | Cod sursa (job #1000703)
#include <fstream>
#define Base 1000000000
#define In "indep.in"
#define Out "indep.out"
#define ValMax 1000
using namespace std ;
///calculam dp[i][j] = numarul de subsiruri formate din primele i elemente cu cmmdc = j
int dp[2][1005][1005], a[1005];
inline void Add(int A[], int B[])
{
int i, t = 0;
for (i = 1; i <= A[0] || i <= B[0] || t; ++i, t/=Base)
A[i] = (t += A[i] + B[i]) % Base;
A[0] = i - 1;
}
inline int Cmmdc(int x, int y)
{
int r;
while (y)
{
r = x%y;
x = y;
y = r;
}
return x;
}
inline void Write(int a[])
{
printf("%d",a[a[0]]);
for(int i = a[0]-1; i > 0;--i)
printf("%09d",a[i]);
printf("\n");
}
int main()
{
ifstream f(In);
int i,Line, n, x, j;
f >> n;
a[0] = a[1] = 1;
for(i = Line = 1;i <= n; ++i,Line ^= 1)
{
f >> x;
Add(dp[Line][x],a);
for(j = 1;j <= ValMax; ++j)
{
Add(dp[Line][j],dp[Line^1][j]);
Add(dp[Line][Cmmdc(j,x)],dp[Line^1][j]);
if(i!=n || j!=1)
for(;dp[Line^1][j][0];--dp[Line^1][j][0])
dp[Line^1][j][dp[Line^1][j][0]] = 0;
}
}
freopen(Out,"w",stdout);
Write(dp[n&1][1]);
return 0;
}