Pagini recente » Cod sursa (job #2420685) | Cod sursa (job #1911787) | Cod sursa (job #3131400) | Cod sursa (job #1902173) | Cod sursa (job #257203)
Cod sursa(job #257203)
#include <stdio.h>
#include <string.h>
#define LMAX 1000
#define BAZA 100000000
typedef int Huge[LMAX];
int N,a[505],VMAX;
Huge nr[2][1001];
int cmmdc(int a,int b){
return b==0?a:cmmdc(b,a%b);
}
void add(Huge A,Huge B){
int i,t=0;
for (i=1;i<=A[0] || i<=B[0] || t;++i,t/=BAZA)
A[i]=(t+=A[i]+B[i])%BAZA;
A[0]=i-1;
}
void sub(Huge A, Huge B){
int i, t = 0;
for (i = 1; i <= A[0]; i++)
A[i] += (t = (A[i] -= B[i] + t) < 0) * BAZA;
for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
int main(){
int i,j,k,now=0,prev;
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
scanf("%d",&N);
for (i=1;i<=N;++i) {scanf("%d",&a[i]);
VMAX=VMAX<a[i]?a[i]:VMAX;}
for (i=1;i<=VMAX;++i)
nr[now][i][0]=1;
Huge unu;
memset(unu,0,sizeof(unu));
unu[1]=unu[0]=1;
for (i=1;i<=N;++i){
now=i&1;prev=1-now;
for (j=1;j<=VMAX;++j){
k=cmmdc(j,a[i]);
memcpy(nr[now][j],nr[prev][j],sizeof(nr[now][j]));
add(nr[now][k],nr[prev][j]);
}
add(nr[now][a[i]],unu);
}
Huge sol,nr_unu;
memmove(sol,nr[now][1],sizeof(sol));
memset(nr_unu,0,sizeof(nr_unu));
for (i=1;i<=N;++i)
if (a[i]==1) add(nr_unu,unu);
sub(sol,nr_unu);
printf("%d",sol[sol[0]]);
for (i=sol[0]-1;i;i--) printf("%08d",sol[i]);
return 0;
}