Cod sursa(job #2074732)

Utilizator iulius510iulius alexandru iulius510 Data 24 noiembrie 2017 22:39:26
Problema Fractii Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int p[30],m;
long long S;
void factorizare(int n)
{
    int k=0;
    int i;
    int aux=n;
    if(n%2==0)
    {
        p[1]=2;
        k=1;
        while(n%2==0)
            n=n/2;
        for(i=3; n>1; i+=2)
        {
            if(n%i==0)
                p[++k]=i;
            while(n%i==0)
                n=n/i;
        }
    }
    else
    {
        for(i=3; n>1; i+=2)

        {
            if(n%i==0)
            {
                p[++k]=i;
                while(n%i==0)
                    n=n/i;
            }
        }
    }
    if(n!=1)
        {
            p[1]=n;
            k=1;
        }
        m=k;
}

    int main()
    {
        FILE *f,*g;
        f=fopen("fractii.in","r");
        g=fopen("fractii.out","w");
        int N;
        int i;
        fscanf(f,"%d",&N);
        for(i=1; i<=N; i++)
        {
            factorizare(i);
            long long c;
            c=1ll<<m;
            //printf("%d ",m);
            int j,M=0;
            long long y=0;
            while(y<c)
            {
                int t=0;
                int P=1;
                for(j=1; j<=m; j++)
                    if(y&(1<<(j-1)))
                    {
                        P*=p[j];
                        t++;
                    }
                if(t%2==0)
                    M+=N/P;
                else
                    M-=N/P;
               // printf("%d %lld %d %d\n",i,y,P,t);
                y=y+1;

            }

            S+=M;
            //printf("%lld",S);
            //printf("\n");
            //for(j=1;j<=m;j++)
            //printf("%d ",p[j]);
            //printf("\n");

        }
        fprintf(g,"%lld",S);

        return 0;
    }