Pagini recente » Cod sursa (job #1740097) | Cod sursa (job #706239) | Cod sursa (job #99439) | Cod sursa (job #896693) | Cod sursa (job #84978)
Cod sursa(job #84978)
#include <stdio.h>
#include <string.h>
using namespace std;
#define Nmax 500
#define Dmax 1001
#define Lmax 30
#define baza 100000000
struct numar { int c[Lmax]; };
int N;
int X[Nmax];
numar A[2][Dmax];
void citire()
{
int i;
freopen("indep.in","r",stdin);
scanf("%d",&N);
for (i=0;i<N;++i)
scanf("%d",&X[i]);
fclose(stdin);
}
void aduna(numar &N1, numar N2)
{
int i,r=0,rr=0;
for (i=1;i<=N2.c[0];++i)
{
rr=(N1.c[i]+N2.c[i]+r)/baza;
N1.c[i]=(N1.c[i]+N2.c[i]+r)%baza;
r=rr;
}
--i;
while (r>0)
{
++i;
rr=(N1.c[i]+r)/baza;
N1.c[i]=(N1.c[i]+r)%baza;
r=rr;
}
if (i>N1.c[0]) N1.c[0]=i;
}
int cmmdc(int A,int B)
{
int r;
do
{
r=A%B;
A=B;
B=r;
}
while (r>0);
return A;
}
void afisare(int rr)
{
int i,r;
freopen("indep.out","w",stdout);
printf("%d",A[rr][1].c[A[rr][1].c[0]]);
for (i=A[rr][1].c[0]-1;i>0;--i)
{
r=baza/10;
while (A[rr][1].c[i]<r)
{
printf("%d",0);
r/=10;
}
if (r>0) printf("%d",A[rr][1].c[i]);
}
fclose(stdout);
}
void dinamica()
{
int i,j,d,k,r=0;
for (i=0;i<N;++i)
{
r=1-r;
for (j=1;j<Dmax;++j)
{
memcpy(A[r][j].c,A[1-r][j].c,sizeof(A[1-r][j].c));
}
A[r][X[i]].c[1]+=1;
j=1;
while (A[r][X[i]].c[j]>baza)
{
A[r][X[i]].c[j]-=baza;
++A[r][X[i]].c[++j];
}
if (j>A[r][X[i]].c[0]) A[r][X[i]].c[0]=j;
for (j=1;j<Dmax;++j)
{
d=cmmdc(j,X[i]);
aduna(A[r][d],A[1-r][j]);
//aduna(A[r][j],A[1-r][j]);
}
}
afisare(r);
}
int main()
{
citire();
dinamica();
return 0;
}