Pagini recente » Cod sursa (job #309166) | Cod sursa (job #2442926) | Cod sursa (job #154606) | Cod sursa (job #3038487) | Cod sursa (job #1198598)
#include <fstream>
#include <algorithm>
#include <cstring>
#define NMAX 505
#define VALMAX 1005
#define cifre 60
#define base 1000
using namespace std;
ofstream cout("indep.out");
class nr_mare
{
public:
int v[cifre];
nr_mare(int c=0)
{
memset(v,0,sizeof(v));
v[0]=1;
v[1]=c;
}
nr_mare operator+(nr_mare b)
{
nr_mare c;
c.v[0]=max(v[0],b.v[0]);
int i,tr=0;
for(i=1;i<=c.v[0];i++){
c.v[i]=v[i]+b.v[i]+tr;
tr=c.v[i]/base;
c.v[i]%=base;
}
while(tr){
c.v[++c.v[0]]=tr;
tr=c.v[c.v[0]]/base;
c.v[c.v[0]]%=base;
}
return c;
}
nr_mare operator-(nr_mare b)
{
nr_mare c;
c.v[0]=v[0];
int i,tr=0;
for(i=1;i<=c.v[0];i++){
c.v[i]=v[i]-b.v[i]-tr;
tr=0;
if(c.v[i]<0){
tr=1;
c.v[i]+=base;
}
}
while(c.v[0]>1 && !c.v[c.v[0]])
c.v[0]--;
return c;
}
nr_mare operator*(const int &b)
{
nr_mare c;
c.v[0]=v[0];
int i,tr=0;
for(i=1;i<=c.v[0];i++){
c.v[i]=v[i]*b+tr;
tr=c.v[i]/base;
c.v[i]%=base;
}
while(tr){
c.v[++c.v[0]]=tr;
tr=c.v[c.v[0]]/base;
c.v[c.v[0]]%=base;
}
return c;
}
};
ostream& operator<<(ostream &g,const nr_mare &x)
{
for(int i=x.v[0];i>=1;i--)
{
if(i!=x.v[0])
{
if(!(x.v[i]/10)) //Baza 100
cout<<'0';
if(!(x.v[i]/100)) //Baza 1000
cout<<'0';
//if(!(x.v[i]/1000)) //Baza 10000
// cout<<'0';
}
cout<<x.v[i];
}
return g;
}
nr_mare put2[NMAX];
inline void precalc(int &n)
{
for(int i=1;i<=n;i++)
put2[i]=((put2[i-1]*2)+nr_mare(1));
}
int v[NMAX];
int cate[VALMAX];
inline void proc_nr(int &n)
{
for(int i=1;i<VALMAX;i++)
for(int j=1;j<=n;j++)
if(v[j]%i==0)
cate[i]++;
}
nr_mare din[VALMAX];
inline void calc_ans(int &n)
{
for(int i=VALMAX-1;i>=1;i--){
din[i]=put2[cate[i]];
for(int j=2;(i*j)<VALMAX;j++)
din[i]=din[i]-din[i*j];
}
}
int main()
{
ifstream cin("indep.in");
int n=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>v[i];
proc_nr(n);
precalc(n);
calc_ans(n);
cout<<din[1]<<'\n';
cin.close();
cout.close();
return 0;
}