Cod sursa(job #2149030)

Utilizator ovidius11Stiriu Ovidius ovidius11 Data 2 martie 2018 11:41:16
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int p2[505][200],fact[200],rasp[205];
pair<int,int>v[1005];
int scad(int a[],int b[]){
int i,t=0;
for(i=1;i<=a[0];i++){
a[i]-=((i<=b[0])?b[i]:0)+t;
a[i]+=(t=a[i]<0)*10;}
for(;a[0]>1 && !a[a[0]];a[0]--);}
int add(int a[],int b[]){
int i,t=0;
for(i=1;i<=a[0] || i<=b[0] || t;i++){
a[i]=a[i]+b[i]+t;
t=a[i]/10;
a[i]=a[i]%10;}
a[0]=i-1;}
int inmul(int a[],int x){
int i,t=0;
for(i=1;i<=a[0] || t;i++){
a[i]=a[i]*x+t;
t=a[i]/10;
a[i]=a[i]%10;}
a[0]=i-1;}
int drop(int a[]){
int i,j;
for(i=1;i<=a[0];i++)
if (a[i]!=0){
a[i]--;
for(j=1;j<i;j++)
a[j]=9;
if (a[i]==0 && i==a[0])
a[0]--;
break;}}
int copyc(int a[],int b[]){
int i;
for(i=1;i<=b[0];i++)
a[i]=b[i];
a[0]=b[0];}
int main(){
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
int n,i,x,u=0,d,e,j,nr,cnt;
scanf("%d",&n);
p2[0][0]=p2[0][1]=1;
for(i=1;i<=500;i++){
copyc(p2[i],p2[i-1]);
inmul(p2[i],2);}
for(i=1;i<=500;i++)
drop(p2[i]);
for(i=1;i<=n;i++){
scanf("%d",&x);
d=2;
u=0;
while(d*d<=x && x>1){
e=0;
while(x%d==0){
x=x/d;
e++;}
if (e)
fact[++u]=d;
d++;}
if (x>1)
fact[++u]=x;
for(j=1;j<(1<<u);j++){
nr=1;
cnt=0;
for(e=1;e<=u;e++)
if (j&(1<<(e-1)))
nr=nr*fact[e],cnt++;
v[nr].first++;
v[nr].second=cnt%2;}}
for(i=1;i<=1000;i++)
if (v[i].first)
if (v[i].second==1)
add(rasp,p2[v[i].first]);
else
scad(rasp,p2[v[i].first]);
scad(p2[n],rasp);
for(i=p2[n][0];i>=1;i--)
printf("%d",p2[n][i]);
return 0;}