Cod sursa(job #2076347)

Utilizator VladGhetinaVlad Ghetina VladGhetina Data 26 noiembrie 2017 14:19:26
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <cstdio>

using namespace std;

#define LIM 5000002

int doi[LIM],trei[LIM],cinci[LIM];
int r , d , res;

void Compute(){
    int i , p;
    for( p = 2; p < LIM; p *= 2 )
        for( i = p; i < LIM; i += p )
            doi[i]++;
    for( p = 3; p < LIM; p *= 3 )
        for( i = p; i < LIM; i += p )
            trei[i]++;
    for( p = 5; p < LIM; p *= 5 )
        for( i = p; i < LIM; i += p )
            cinci[i]++;
    for( i = 1; i < LIM; i ++ ){
        doi[i]  += doi[i-1];
        trei[i] += trei[i-1];
        cinci[i] += cinci[i-1]; }
}

void Solve()
{
    int i , a , b , c , dif = 0;

    for ( i = 1; i <= r/2 ; i ++ ){
        if ( d == 2 )
        {
            a = doi[r];
            b = doi[i];
            c = doi[r-i];
            if ( a > b+c )
                res++;
            if ( r%2 == 0 && i == r/2 && a > b+c )
                dif = 1;
        }
        else if ( d == 3 )
        {
            a = trei[r];
            b = trei[i];
            c = trei[r-i];
            if ( a > b+c )
                res++;
            if ( r%2 == 0 && i == r/2 && a > b+c )
                dif = 1;
        }
        else if ( d == 5 )
        {
            a = cinci[r];
            b = cinci[i];
            c = cinci[r-i];
            if ( a > b+c )
                res++;
            if ( r%2 == 0 && i == r/2 && a > b+c )
                dif = 1;
        }
        else if ( d == 4 )
        {
            a = doi[r];
            b = doi[i];
            c = doi[r-i];
            if ( a >= b+c+2 )
                res++;
            if ( r%2 == 0 && i == r/2 && a >= b+c+2 )
                dif = 1;
        }
        else if ( d == 6 )
        {
            a = doi[r];
            b = doi[i];
            c = doi[r-i];

            if ( a > b+c )
            {
                a = trei[r];
                b = trei[i];
                c = trei[r-i];
                if ( a > b+c )
                    res++;
                if ( r%2 == 0 && i == r/2 && a > b+c )
                dif = 1;
            }
        }
    }
    res *= 2 , res -= dif;
    printf ( "%d" , res );

}

int main()
{
     freopen("pascal.in","r",stdin);
     freopen("pascal.out","w",stdout);

     scanf ( "%d%d" , &r , &d );
     Compute();
     Solve();
}