Pagini recente » Cod sursa (job #1039540) | Monitorul de evaluare | Cod sursa (job #681531) | Cod sursa (job #1994856) | Cod sursa (job #393150)
Cod sursa(job #393150)
#include <cstdio>
#define NMAX 501
#define VALMAX 1001
#define CIFREMAX 301
int N;
int e[NMAX];
int G[VALMAX];
int par[VALMAX];
int p[NMAX][CIFREMAX];
int rez[CIFREMAX];
int paritate=0;
void citire()
{
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",&e[i]);
}
void scriere()
{
for(int i=rez[0];i;i--)
printf("%d",rez[i]);
}
void ciur_constructie()
{
int ciur[VALMAX]={0},prime[VALMAX]={0};
for(int i=2;i<=VALMAX;i++)
if(!ciur[i])
{
par[i]=1,prime[i]=1;
for(int j=i*i;j<=VALMAX;j++)
ciur[j]=1;
}
for(int i=2;i<=VALMAX;i++)
if(!ciur[i])
for(int j=i+1;j<=VALMAX;j+=i)
if(!ciur[j])
{
prime[i*j]=1;
par[i*j]=par[i]+par[j];
}
G[1]=N;
for(int i=1;i<=VALMAX;i++)
if(prime[i])
for(int j=1;j<=N;j++)
if(e[j]%i==0)
G[i]++;
for(int i=1;i<=VALMAX;i++)
if(G[i]>0 && par[i]>paritate)
paritate=par[i];
if(paritate%2==1)
paritate--;
}
void precalculare()
{
p[1][0]=1;p[1][1]=2;
for(int i=2;i<=N;i++)
{
int j,t=0;
for(j=1;j<=p[i-1][0] || t;j++,t=t/10)
p[i][j]=(t+=p[i-1][j]*2)%10;
p[i][0]=j-1;
}
for(int i=1;i<=N;i++)
p[i][1]--;
}
void adunare(int x)
{
int i,t=0;
for(i=1;i<=p[x][0] || i<=rez[0] || t;i++,t=t/10)
rez[i]=(t+=rez[i]+p[x][i])%10;
rez[0]=i-1;
}
void scadere(int x)
{
int t=0;
for(int i=1;i<=rez[0];i++)
rez[i]+=(t=(rez[i]-=p[x][i]+t)<0)*10;
while(rez[0]>1 && !rez[rez[0]])
rez[0]--;
}
void rezolvare()
{
for(int i=1;i<=VALMAX;i++)
if(G[i] && par[i]<=paritate)
if(par[i]%2==0)
adunare(G[i]);
else
scadere(G[i]);
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
citire();
precalculare();
ciur_constructie();
rezolvare();
scriere();
return 0;
}