Pagini recente » Cod sursa (job #335874) | Istoria paginii runda/your11thnightmare | Istoria paginii runda/preoji2020/clasament | Cod sursa (job #1583940) | Cod sursa (job #607072)
Cod sursa(job #607072)
#include <stdio.h>
#define NMax 510
#define MMax 1010
#define LMax 31
const char IN[]="indep.in",OUT[]="indep.out";
const long long base=1000000000000000000LL;
int N;
long long T[MMax][LMax] ;
int a[NMax];
inline void add(long long *a,long long *b)
{
int t=0,i;
a[0]= b[0]>a[0] ? b[0] : a[0];
for (i=1;i<=a[0];++i)
{
a[i]+=b[i]+t;t=0;
while (a[i]>=base) a[i]-=base,++t;
}
if (t) a[++a[0]]=t;
}
inline void inc(long long *a)
{
int t=1,i;
a[0]+=!a[0];
for (i=1;i<=a[0];++i)
{
a[i]+=t;t=0;
while (a[i]>=base) a[i]-=base,++t;
}
if (t) a[++a[0]]=t;
}
inline int gcd(int a,int b)
{
static int r;
while (b)
b= (r=a%b,a=b,r);
return a;
}
void solve()
{
int i,j;
for (i=0;i<N;++i)
{
for (j=1;j<MMax;++j)
//T[gcd(j,a[i])]+=T[j];
add(T[gcd(j,a[i])],T[j]);
inc(T[a[i]]);
}
}
inline void write(long long *a)
{
int i;long long b;
for (i=a[0];i>0;--i)
{
if (i!=a[0])
for (b=base/10;b>1 && a[i]<b;b/=10) printf("0");
printf("%lld",a[i]);
}
}
int main()
{
int i;
freopen(IN,"r",stdin);
scanf("%d",&N);
for (i=0;i<N;++i) scanf("%d",a+i);
fclose(stdin);
solve();
T[1][0]+=!T[1][0];
freopen(OUT,"w",stdout);
write(T[1]);printf("\n");
fclose(stdout);
return 0;
}