10490 - Mr. Azad and his Son!!!!!

#include<stdio.h>
#include<math.h>
#define MAX 10000000
using namespace std;
bool arr[MAX];
void sieve()
{
    long long int i,j,k;
    k=sqrt(MAX);
    for(i=3;i<=k;i+=2)
    {
        if(arr[i]==0)
        {
            for(j=i*i;j<MAX;j+=i+i)
            {
                arr[j]=1;
            }
        }
    }
    arr[1]=1;
    for(i=4;i<MAX;i=i+2)
    {
        arr[i]=1;
    }
}
int main()
{
    sieve();
    unsigned long long a,b,n,p;
    while(scanf("%llu",&n)==1)
    {
        if(n==0)
        {
            break;
        }
        if(n==29)
        {
            printf("Given number is prime. But, NO perfect number is available.\n");
            continue;
        }
        if(n==31)
        {
            a=pow(2,n);
            b=pow(2,(n-1))*(a-1);
            printf("Perfect: %llu!\n",b);
            continue;
        }
        a=pow(2,n);
        if(!arr[n] && !arr[a-1])
        {
            b=pow(2,(n-1))*(a-1);
            printf("Perfect: %llu!\n",b);
        }
        else if(!arr[n] && arr[a-1])
        {
            printf("Given number is prime. But, NO perfect number is available.\n");
        }
        else
        {
            printf("Given number is NOT prime! NO perfect number is available.\n");
        }
    }
    return 0;
}

0 comments: (+add yours?)