Cod sursa(job #1366849)

Utilizator dumitrubogdanDumitru Bogdan Mihai dumitrubogdan Data 1 martie 2015 14:09:31
Problema Fractii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;
int vprim[1000000];
long S;

void Afisare_Vector(int v[],long dim){
    for(long i=1;i<=dim;i++)
        printf("%d - %s\n ",i, ( v[i]==-1 ? "NP" :"ESTE PRIM" ) ) ;

    printf("\n");
}

bool Prim(long nr){
    if(nr==1)
        return false;
    for(long i=2; i<=sqrt(nr); i++){
        if(nr%i==0)
            return false;
    }
    return true;
}

void Eratostene(long n){
    long i=2,j;
    vprim[1]=-1;
    while(i<=n){
        if(vprim[i]==0){
            ( Prim(i)==true ? vprim[i]=1 : vprim[i]=-1 );
            for(j=i+i; j<=n; j+=i)
                vprim[j]=-1;
        }
        i++;
    }
}

long CMMDC(long a, long b){
    if(a%2==0 && b%2==0){
        return 2;
    }

    long r;
    r=a%b;
    while(r)
    {
        a=b;
        b=r;
        r=a%b;
    }
    if(b==1) {
        return 0;
    }
    else{
        return b;
    }
}

bool Prime_intre_ele(long a, long b){
    if(CMMDC(a,b)==0)
        return true;
    return false;
}

int main()
{
    long n;
    FILE *f=fopen("fractii.in","r");
    FILE *g=fopen("fractii.out","w");
    fscanf(f,"%d",&n);
    cin>>n;
    Eratostene(n);
    S=n;
    for(long i=2;i<=n;i++)
    {
        if(vprim[i]==1){
            S=S+n-(n/i);
        }
        else {// i nu este prim
            S++;
            for(long j=2;j<=n;j++){
                if(vprim[j]==1){
                    if((i%j!=0) && (j%i!=0)){
                        S++;
                    }
                }
                else {// j nu este prim
                    if(Prime_intre_ele(i,j)){
                        S++;
                    }
                }
            }
        }
    }
    printf(" S=%d ",S);
    fprintf(g,"%d",S);
    fclose(f);
    fclose(g);

    return 0;
}