Pagini recente » Cod sursa (job #2749342) | ss | Cod sursa (job #955186) | Cod sursa (job #1081963) | Cod sursa (job #975249)
Cod sursa(job #975249)
#include<fstream>
#include<cstdio>
using namespace std;
int n,v[510],valmax;
int nr[2][1010][1010],gcd[1010][1010],unu[1010];
inline void Adunare(int A[],int B[])
{
int i,t=0;
for(i=1;i<=A[0] || i<=B[0] || t;i++,t/=1000000000)
A[i]=(t+=A[i]+B[i])%1000000000;
A[0]=i-1;
}
inline void Memset(int A[])
{
int i;
for(i=A[0];i>=0;i--)
A[i]=0;
}
inline void Copiere(int A[],int B[])
{
int i;
Memset(B);
for(i=0;i<=A[0];i++)
B[i]=A[i];
}
inline int Euclid(int a,int b)
{
int r;
while(b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
int main()
{
int i,j;
ifstream fin("indep.in");
fin>>n;
for(i=1;i<=n;i++)
{
fin>>v[i];
valmax=max(valmax,v[i]);
}
fin.close();
for(i=1;i<=valmax;i++)
for(j=i;j<=valmax;j++)
gcd[i][j]=gcd[j][i]=Euclid(i,j);
unu[0]=unu[1]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=valmax;j++)
{
Adunare(nr[1][gcd[j][v[i]]],nr[0][j]);
Adunare(nr[1][j],nr[0][j]);
}
Adunare(nr[1][v[i]],unu);
for(j=1;j<=valmax;j++)
{
Copiere(nr[1][j],nr[0][j]);
Memset(nr[1][j]);
}
}
freopen("indep.out","w",stdout);
printf("%d",nr[0][1][nr[0][1][0]]);
for(i=nr[0][1][0]-1;i>0;i--)
printf("%09d",nr[0][1][i]);
printf("\n");
return 0;
}