Pagini recente » Cod sursa (job #1268799) | Cod sursa (job #722962) | Cod sursa (job #3292128) | Cod sursa (job #2640888) | Cod sursa (job #997994)
Cod sursa(job #997994)
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int NMAX = 1005, BASE = 10000;
int N, V[NMAX];
int GCD(int A, int B)
{
if(!B) return A;
return GCD(B, A % B);
}
class Huge
{
public: int D[2010];
Huge()
{
memset(D, 0, sizeof(D));
}
Huge(int X)
{
*this = X;
}
Huge operator= (int X)
{
memset(D, 0, sizeof(D));
while(X) D[++D[0]] = X % BASE, X /= BASE;
return *this;
}
Huge operator= (Huge X)
{
memcpy(D, X.D, sizeof(X.D));
return *this;
}
Huge operator+ (Huge X) const
{
int i, T = 0;
Huge Now;
for(i = 1; i <= D[0] || i <= X.D[0] || T; i ++, T /= BASE)
Now.D[i] = (T += X.D[i] + D[i]) % BASE;
Now.D[0] = i - 1;
return Now;
}
void Print()
{
printf("%d", D[D[0]]);
for(int i = D[0] - 1; i; -- i) printf("%04d", D[i]);
printf("\n");
}
};
Huge DP[NMAX];
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]);
for(int i = 1; i <= N; ++ i)
{
for(int j = 1; j <= 1000; ++ j)
DP[GCD(j, V[i])] = DP[GCD(j, V[i])] + DP[j];
DP[V[i]] = DP[V[i]] + 1;
}
DP[1].Print();
return 0;
}