#include<stdio.h>
#include<mpi.h>
#include<math.h>
#include<stdlib.h>

int broj_cifara(int x){
    int suma=0;
    while(x){
        suma++;
        x=x/10;

    }
    return suma;
}

int kaprekarov(int x){
    int kvadrat=x*x;
    int duplikat=kvadrat;
    int brcifarax=broj_cifara(x);
    int levi=0;
    int desni=0;
    int br=1;
    for(int i=0;i<brcifarax;i++){
        desni=desni+br*(kvadrat%10);
        br=br*10;
        kvadrat=kvadrat/10;
        levi=kvadrat;
        if(broj_cifara(desni)>=broj_cifara(levi) && (levi+desni)==x){
            return 1;
        }
    }

    return 0;

}

#define n 100000000

int main(int argc, char *argv[]){
    MPI_Init(&argc,&argv);
    int np,id;
    MPI_Comm_size(MPI_COMM_WORLD,&np);
    MPI_Comm_rank(MPI_COMM_WORLD,&id);

    int *niz=(int *)malloc(sqrt(n)*sizeof(int));
    int lokalna_suma=0;
    for(int i=id;i<n;i+=np){
        if(kaprekarov(i)){
            niz[lokalna_suma]=i;
            lokalna_suma++;
        }
    }
     


    int globalna_suma=0;
    MPI_Reduce(&lokalna_suma,&globalna_suma,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);

    int *svi=NULL;

    if(id==0){
        int *svi=(int *)malloc(globalna_suma*sizeof(int));
    }
    
    
    //MPI_Gather(niz,np,MPI_INT,svi,np,MPI_INT,0,MPI_COMM_WORLD);
    

    if(id==0){
        
            printf("Ukupno ih ima: %d\n",globalna_suma);
            //for(int i=0;i<globalna_suma;i++){
              //  printf("%d",svi[i]);
            //}

            free(svi);
    }
        
    

    free(niz);
    MPI_Finalize();
    return 0;
}