Cod sursa(job #825210)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 27 noiembrie 2012 21:00:39
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>

#define MAX_SIZE 5000001


using namespace std;

short A[MAX_SIZE][2];
int size = -1;
short divizori[2];


short is_divizible(int R , int poz)
{
    int ok = 1;
    for (int i = 0 ; i <= size;i++)
    {
        if (A[R][i] - A[poz][i]- A[R-poz][i] < divizori[i])
        {
            ok = 0;
        }
    }
    return ok;
}


int main()
{
    FILE *input = fopen("pascal.in","r");
    FILE *output = fopen("pascal.out","w");
    int R;
    int D;
    fscanf(input,"%d%d",&R,&D);
    short div = 2;
    while (D != 1)
    {
        short ok = 0;
        short nr = 0;
        while (D % div == 0 )
        {
            D /= div;
            nr++;
            ok = 1;
        }
        if ( ok == 1)
        {
            size ++;
            divizori[size] = nr;
            A[0][size] = 0;
            for (int i = 1 ; i<= R ;i++ )
            {
                int sum = 0;
                int x = i;
                while (x % div== 0)
                {
                    x /= div;
                    sum++;
                }
                A[i][size] = A[i-1][size] + sum;
            }
        }
        div++;
    }
    int raspuns = 0;

    for (int i = 1; i < (R / 2); i++ )
    {
        if (is_divizible(R,i) == 1)
        {
            raspuns++;
            raspuns++;
        }
    }
    if ((R-1) % 2 == 0)
    {
        if (is_divizible(R,R/2) == 1)
        {
            raspuns++;
            raspuns++;
        }
    }
    else
    {
        if (is_divizible(R,R/2) == 1)
        {
            raspuns++;
        }
    }
    fprintf(output,"%d",raspuns);
    fclose(input);
    fclose(output);
    return 0;
}