Cod sursa(job #825191)

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

#define MAX_SIZE 5000001
using namespace std;

short A[MAX_SIZE][2];
int size_A = -1;
vector <short> divizori;


short is_divizible(int R , int poz)
{
    int ok = 1;
    for (int i = 0 ; i < divizori.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_A ++;
            divizori.push_back(nr);
            A[0][size_A] = 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] = A[i-1][size_A] + 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;
}