August 2019

Sultan Qureshi

Solution


#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */   
    int n;
    cin>>n;
    int odd =0, even =0, oddcomp=0;
    for(int i =0;i<n;i++)
    {
        int p;
        cin>>p;
        if(p%2==1)
        {
            odd++;
            for(int j = 2;j<=int(sqrt(p+2));j++)
            {
                if((p+2)%j==0)
                {
                   oddcomp++;
                    break;
                } 
                    
            }
        }
        else
            even++;
    
    }
    int ans = (odd*(odd-1))/2;
    ans+= (even*(even-1))/2;
    if(even>0)
        ans+=oddcomp;
    cout<<ans;
    return 0;
}


Alternate Solution using Seive


#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int primes[200001];

void seive()
{
    fill(primes,primes+200001,1);
    for(int i =2;i*i<200001;i++)
    {
        if(primes[i]==1)
            
        {
         
            int p = i+i;
            for(;p<200001;p=p+i)
                primes[p]=0;
        }
    }
    primes[0]=0;
    primes[1]=0;
}


int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
    seive();
    int n;
    cin>>n;
    int odd = 0,even=0;
    long long int arr[n];
    for(int i =0;i<n;i++)
    {
        cin>>arr[i];
        if(arr[i]%2)
            odd++;
        else
            even++;
    }
    
    long long int ans = (odd*(odd-1))/2 + (even*(even-1)/2);
    long long int c =0;
    for(int i =0;i<n;i++)
    {
        if(arr[i]%2==1)
        {
            int v = arr[i]+2;
            if(!primes[v])
                c++;
        }
    }
    c=c*even;
    ans += c;
    cout<<ans;
    return 0;
}