Pagini recente » Cod sursa (job #1369022) | Cod sursa (job #2623648) | Cod sursa (job #68180) | Cod sursa (job #330085) | Cod sursa (job #1779025)
#include <cstdio>
#include <iostream>
#define VAL_MAX 1000
using namespace std;
int v[501],p2[501][1000],ss[501][1000],ciur[VAL_MAX+1],pl[1000],mn[1000],f[1001],prm[1000],gen[10],prim[10];
void adunss (int i){
int j,t=0;
for (j=1;j<=max(p2[i-1][0],ss[i-1][0]);j++){
ss[i][j]=p2[i-1][j]+ss[i-1][j]+t;
t=ss[i][j]/10;
ss[i][j]%=10;
}
ss[i][0]=max(p2[i-1][0],ss[i-1][0]);
if (t)
ss[i][++ss[i][0]]=1;
}
void inmult2 (int i){
int j,t=0;
for (j=1;j<=p2[i-1][0];j++){
p2[i][j]=p2[i-1][j]*2+t;
t=p2[i][j]/10;
p2[i][j]%=10;
}
p2[i][0]=p2[i-1][0];
while (t){
p2[i][++p2[i][0]]=t%10;
t/=10;
}
}
void adun (int n,int m){
int i,t=0;
// la ss[n] il adun pe p
for (i=1;i<=ss[n][0];i++){
ss[n][i]=ss[n][i]+ss[m][i]+t;
t=ss[n][i]/10;
ss[n][i]%=10;
}
if (t!=0)
ss[n][++ss[n][0]]=1;
}
void scad (int n,int m){
// la ss[n] il scad pe p
int i,t=0;
for (i=1;i<=ss[n][0];i++){
ss[n][i]=ss[n][i]-ss[m][i]-t;
if (ss[n][i]<0)
t=1;
else t=0;
if (t)
ss[n][i]+=10;
}
while (!ss[n][ss[n][0]])
ss[n][0]--;
}
int main()
{
FILE *fin=fopen ("indep.in","r");
FILE *fout=fopen ("indep.out","w");
int n,i,prod,nrf,j,d,elem;
fscanf (fin,"%d",&n);
for (i=1;i<=n;i++)
fscanf (fin,"%d",&v[i]);
p2[1][0]=ss[1][1]=ss[1][0]=1;
p2[1][1]=2;
for (i=2;i<=n;i++){
adunss (i);
inmult2 (i);
}
// ss reprezinta nr de subsiruri care se pot forma cu n numere
// p2[n] este 2^n
for (i=2;i<=VAL_MAX;i++){
if (ciur[i]==0)
for (j=2*i;j<=VAL_MAX;j++)
ciur[j]++;
}
// ciur[j] reprezinta nr de divizori primi ai lui j
// cand j e prim, ciur[j]=0
for (i=1;i<=n;i++){
d=2;
f[v[i]]++;
while (d*d<=v[i]){
if (v[i]%d==0){
f[v[i]/d]++;
if (d*d<v[i])
f[d]++;
}
d++;
}
}
// f[i] e diferit de 0 doar daca i e numar prim si EXISTA v[j] a.i. v[j]%i==0
elem=0;
for (i=1;i<=1000;i++){
if (f[i]!=0 && ciur[i]==0)
prim[++elem]=i;
}
// avem in v TOTI factorii primi ai numerelor
i=elem;
while (!gen[0]){
j=i;
while (gen[j]){
gen[j]=0;
j--;
}
if (!j)
break;
gen[j]=1;
nrf=0;
prod=1;
for (j=1;j<=i;j++){
if (gen[j]){
prod*=prim[j];
nrf++;
}
}
if (ciur[prod]%2==0 && ciur[prod]!=0){
// produsul se va scadea
adun (n,f[prod]);
}
else scad (n,f[prod]);
}
if (ss[n][1]==0)
ss[n][0]=1;
for (i=ss[n][0];i>0;i--)
fprintf (fout,"%d",ss[n][i]);
return 0;
}