Pagini recente » Autentificare | Istoria paginii runda/simulare_preoji/clasament | Arhiva de probleme | Cod sursa (job #2077527) | Cod sursa (job #257071)
Cod sursa(job #257071)
#include <stdio.h>
#include <string.h>
#define LMAX 1000
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/=10)
A[i]=(t+=A[i]+B[i])%10;
A[0]=i-1;
}
int main(){
int i,j,k,now=1,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;
nr[1][a[1]][0]=nr[1][a[1]][1]=1;
for (i=2;i<=N;++i){
now=i&1;prev=1-now;
for (j=1;j<=VMAX;++j){
memcpy(nr[now][j],nr[prev][j],sizeof(nr[now][j]));
for (k=1;k<=VMAX;++k)
if (cmmdc(k,a[i])==j)
add(nr[now][j],nr[prev][k]);
}
}
for (i=nr[now][1][0];i;i--) printf("%d",nr[now][1][i]);
return 0;
}