Cod sursa(job #1825631)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 9 decembrie 2016 15:25:38
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <cstdio>

int r, nr2[5000001], nr3[5000001], nr5[5000001];

using namespace std;

void set2( )
{
    int i, j;

    for( i=2;i<=r;i*=2 )
        for( j=i;j<=r;j+=i )
            nr2[j]++;
}
void set3( )
{
    int i, j;

    for( i=3;i<=r;i*=3 )
        for( j=i;j<=r;j+=i )
            nr3[j]++;
}
void set5( )
{
    int i, j;

    for( i=5;i<=r;i*=5 )
        for( j=i;j<=r;j+=i )
            nr5[j]++;
}

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

    int div, i, d2=0, d3=0, d5=0, n=0;

    scanf( "%d%d", &r, &div );

    if( div%2==0 )
        set2();

    if( div%3==0 )
        set3();

    if( div%5==0 )
        set5();

    switch( div )
    {
        case 2:
            for( i=1;i<(r+1)/2;i++ )
            {
                d2+=nr2[r-i+1]-nr2[i];

                if( d2>0 )
                    n++;
            }
        break;

        case 3:
            for( i=1;i<(r+1)/2;i++ )
            {
                d3+=nr3[r-i+1]-nr3[i];

                if( d3>0 )
                    n++;
            }
        break;

        case 4:
            for( i=1;i<(r+1)/2;i++ )
            {
                d2+=nr2[r-i+1]-nr2[i];

                if( d2>1 )
                    n++;
            }
        break;

        case 5:
            for( i=1;i<(r+1)/2;i++ )
            {
                d5+=nr5[r-i+1]-nr5[i];

                if( d5>0 )
                    n++;
            }
        break;

        case 6:
            for( i=1;i<(r+1)/2;i++ )
            {
                d2+=nr2[r-i+1]-nr2[i];
                d3+=nr3[r-i+1]-nr3[i];

                if( d2>0 && d3>0 )
                    n++;
            }
        break;
    }

    n*=2;

    if( r%2==0 )
    {
        switch( div )
        {
            case 2:
                d2+=nr2[r-i+1]-nr2[i];

                if( d2>0 )
                    n++;
            break;

            case 3:
                d3+=nr3[r-i+1]-nr3[i];

                if( d3>0 )
                    n++;
            break;

            case 4:
                d2+=nr2[r-i+1]-nr2[i];

                if( d2>1 )
                    n++;
            break;

            case 5:
                d5+=nr5[r-i+1]-nr5[i];

                if( d5>0 )
                    n++;
            break;

            case 6:
                d2+=nr2[r-i+1]-nr2[i];
                d3+=nr3[r-i+1]-nr3[i];

                if( d2>0 && d3>0 )
                    n++;
            break;
        }
    }

    printf( "%d", n );

    return 0;
}