Pagini recente » Cod sursa (job #3153069) | Cod sursa (job #2749357) | Cod sursa (job #1455342) | Cod sursa (job #2442296) | Cod sursa (job #847471)
Cod sursa(job #847471)
#include<fstream>
using namespace std;
typedef struct { int lim, nr[501];} tip;
tip sol[505],comb[505][505],scomb,rez,ss;
int i,j,n,a[505];
void aduna(tip a, tip b){
int s,t=0,limc=min(a.lim,b.lim),k;
for (k=500; k>=limc; --k) {
s=a.nr[k]+b.nr[k]+t;
sol[i].nr[k]=s%10;
t=s/10;
}
if (t>0) { --limc; sol[i].nr[limc]=t; }
sol[i].lim=limc;
}
void aduna1(tip a, tip b){
int s,t=0,limc=min(a.lim,b.lim),k;
for (k=500; k>=limc; --k) {
s=a.nr[k]+b.nr[k]+t;
comb[i][j].nr[k]=s%10;
t=s/10;
}
if (t>0) { --limc; comb[i][j].nr[limc]=t; }
comb[i][j].lim=limc;
}
void aduna2(tip a, tip b){
int s,t=0,limc=min(a.lim,b.lim),k;
for (k=500; k>=limc; --k) {
s=a.nr[k]+b.nr[k]+t;
scomb.nr[k]=s%10;
t=s/10;
}
if (t>0) { --limc; scomb.nr[limc]=t; }
scomb.lim=limc;
}
int cmmdc(int a, int b){
int r;
do {
r=a%b;
a=b; b=r;
} while (r!=0);
return(a);
}
int main(void){
ifstream fin("indep.in");
ofstream fout("indep.out");
fin>>n;
for (i=1; i<=n; ++i) fin>>a[i];
sol[1].lim=500; sol[0].lim=500; sol[0].nr[500]=1;
for (i=2; i<=n; ++i){
sol[i].lim=500;
for (j=i-1; j>=1; --j)
if (cmmdc(a[i],a[j])!=1){ aduna(sol[i],sol[0]); aduna(sol[i],sol[j]); }
}
comb[0][0].nr[500]=1; comb[0][0].lim=500; comb[0][1].lim=500;
for (i=1; i<=n; ++i) {
comb[i][0].nr[500]=1; comb[i][0].lim=500;
for (j=1; j<=i; ++j) aduna1(comb[i-1][j-1],comb[i-1][j]);
comb[i][j].lim=500;
}
scomb.lim=500;
for (i=2; i<=n; ++i) aduna2(scomb,comb[n][i]);
i=n;
for (j=n-1; j>=1; --j) aduna(sol[i],sol[j]);
int t=0,llim=scomb.lim;
for (i=500; i>=llim; --i) {
if (t>0&&scomb.nr[i]==0) scomb.nr[i]=9;
else if (t>0) {--scomb.nr[i]; --t; }
rez.nr[i]=scomb.nr[i]-sol[n].nr[i];
if (rez.nr[i]<0) { rez.nr[i]+=10; ++t; }
}
while (rez.nr[llim]==0&&llim<500) ++llim;
for (i=llim; i<=500; ++i) fout<<rez.nr[i];
return(0);
}