Pagini recente » Cod sursa (job #1432569) | Cod sursa (job #1508719) | Cod sursa (job #1350607) | Cod sursa (job #1432568) | Cod sursa (job #240188)
Cod sursa(job #240188)
#include <fstream>
using namespace std;
const int NMAX = 500, VMAX = 1000, LGBIG = 50, BASE = 1000000, LG10BASE = 6;
ifstream fin("indep.in");
ofstream fout("indep.out");
int cmmdc(int a,int b)
{
int r;
while(b)
{
r = a % b;
a = b;
b = r;
}
return a;
}
void attrib_big(int * D,int * S)
{
for(int i = 0; i <= S[0]; ++i)
D[i] = S[i];
}
void init_big(int * &A)
{
A = (int*) malloc(LGBIG * sizeof(int ) );
A[0] = 1; A[1] = 0;
}
int nrcif(int x)
{
for(int t = 10,i = 1; t < BASE; t *= 10,i++)
if(x < t) return i;
return LG10BASE;
}
void print_big(int * A)
{
fout<<A[A[0]];
for(int i = A[0] - 1; i; --i)
{
for(int j = nrcif(A[i]) + 1 ; j <= LG10BASE ; ++j)
fout<<0;
fout<<A[i];
}
}
inline int is_zero_big(int * A)
{
return A[0] == 1 && !A[1] ? 1 : 0;
}
void inc_big(int * D,int x)
{
int i,t = x;
for(i = 1; i <= D[0] || t; ++i, t/= BASE)
D[i] = ( t += D[i]) % BASE;
D[0] = i - 1;
}
void add_big(int * D,int *S) //D += S
{
int i,t = 0;
for(i = 1; i <= D[0] || i <= S[0] || t; ++i, t/= BASE)
D[i] = (t += S[i] + D[i]) % BASE;
D[0] = i - 1;
}
int *A[VMAX], *B[VMAX];
int main()
{
int N,max = 0,sir[NMAX];
fin>>N;
for(int i = 0 ; i < N; ++i)
{
fin>>sir[i];
max = sir[i] > max ? sir[i] : max;
}
for(int i = 1; i <= VMAX; ++i)
init_big(A[i]), init_big(B[i]);
inc_big(A[ sir[0] ], 1);
for(int i = 1; i < N ; ++i)
{
for(int j = 1; j <= max; ++j)
attrib_big(B[j],A[j]);
inc_big(B[ sir[i] ], 1); //for(int i = 1; i <= max; ++i) print_big(A[i]); fout<<endl;
for(int j = 1; j <= max; ++j)
if( !is_zero_big( A[j] ) )
add_big(B[cmmdc(j,sir[i])],A[j]);
for(int j = 1; j <= max; ++j)
attrib_big(A[j],B[j]);
\
}
//for(int i = 1; i <= max; ++i) print_big(A[i]); fout<<endl;
print_big(A[1]);
return 0;
}