getting WA for the same problem in c
#include<stdio.h>
#include<stdlib.h>
char seive[1<<30];
long int end;
long int prime[50847600];
long int last;
void fill(long long int max)
{
long int i,t;
last=0;
end=(long int)(sqrt(max)+1);
//printf("end = %ld\n",end);
memset(seive,0,sizeof(seive));
for(i=3;i<=end;i+=2)
{
if( !(seive[i>>3] & (1<<(i&7))) )
{ prime[last]=i;
last++;
for(t=2*i;t<=end;t+=i)
seive[t>>3]= (seive[t>>3] | (1<<(t&7)));
}
}
}
int primepower(long long int n)//returns 1 if n = p^r for sm r and odd p
{
long int i,t;
double p;
for(i=0;i<last;i++)
{ if( n%prime[i]==0)
{ p=log(n)/log(prime[i]);
t=(long int)p;
if(n==(long long int)(pow(prime[i],t)+0.5))
return 1;
else if(n==(long long int)(pow(prime[i],t+1)+0.5))
return 1;
else
return 0;
}
}
return 0;
}
long long int arr[10001];
int main(void)
{
int t,v=0;
long long int max=0,n;
long int i;
scanf("%d",&t);
for(v=0;v<t;v++)
{ scanf("%lld",&arr[v]);
if( (arr[v]&1)==1)
max=max>arr[v]?max:arr[v];
else if( (arr[v]&2)!=0 )
max=max>(arr[v]>>1)? max:(arr[v]>>1);
}
fill(max);
for(v=0;v<t;v++)
{ n=arr[v];
//scanf("%lld",&n);
if(n==1)
printf("0\n",n-1);
else if(n==4)
printf("%lld\n",n-1);
else if( (n&1)==0 )
{
if((n&2)!=0 & primepower(n>>1))//twice a prime power
{ printf("%lld\n",n-1);}
else
printf("1\n");
}
else if(primepower(n))
printf("%lld\n",n-1);
else
printf("1\n");
}
scanf("%d",&v);
return 0;
}