Pagini recente » Cod sursa (job #3131899) | Cod sursa (job #149061) | Cod sursa (job #1579763) | Cod sursa (job #315441) | Cod sursa (job #1000701)
#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
folosim dinamica inainte :
dp[i+1][j] += dp[i][j] ,asta inseamna ca nu-l folosim pe a[i]
dp[i+1][cmmdc(j,a[i])] += dp[i][j] ,adica il adaugam pe a[i]
dp[i][a[i]] += 1,adica a[i] fomeaza singur un subsir
*/
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^1][j],dp[Line][j]);
Add(dp[Line^1][Cmmdc(j,x)],dp[Line][j]);
if(i!=n || j!=1)
for(;dp[Line][j][0];--dp[Line][j][0])
dp[Line][j][dp[Line][j][0]] = 0;
}
}
freopen(Out,"w",stdout);
Write(dp[n&1][1]);
return 0;
}