Cod sursa(job #928275)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 26 martie 2013 13:10:56
Problema Pascal Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.63 kb
#include <iostream>
#include <fstream>

using namespace std;

long long R, S, D, Nr2, Nr3, Nr5;

long long Legendre( long long numar, long long fact ){

    long long s = 0;

    while ( numar >= fact )
        s += numar / fact,
        numar /= fact;

    return s;
}

void rezolva(){

    if ( R % 2 ){

        for ( long long i = 1; i <= (R + 1) / 2; ++i ){

            Nr2 = Legendre( R, 2) - Legendre( i, 2) - Legendre( R - i, 2);
            Nr3 = Legendre( R, 3) - Legendre( i, 3) - Legendre( R - i, 3);
            Nr5 = Legendre( R, 5) - Legendre( i, 5) - Legendre( R - i, 5);

            switch( D ){

                case 2:
                        if ( Nr2 )
                            S++;
                        break;

                case 3:
                        if ( Nr3 )
                            S++;
                        break;

                case 4:
                        if ( Nr2 > 1 )
                            S++;
                        break;

                case 5:
                        if ( Nr5 )
                            S++;
                        break;

                case 6:
                        if ( Nr2 && Nr3 )
                            S++;
                        break;

                default: break;
            }
        }

        S <<= 1;
    }
    else{
            for ( long long i = 1; i < R / 2; ++i ){

            Nr2 = Legendre( R, 2) - Legendre( i, 2) - Legendre( R - i, 2);
            Nr3 = Legendre( R, 3) - Legendre( i, 3) - Legendre( R - i, 3);
            Nr5 = Legendre( R, 5) - Legendre( i, 5) - Legendre( R - i, 5);

            switch( D ){

                case 2:
                        if ( Nr2 )
                            S++;
                        break;

                case 3:
                        if ( Nr3 )
                            S++;
                        break;

                case 4:
                        if ( Nr2 > 1 )
                            S++;
                        break;

                case 5:
                        if ( Nr5 )
                            S++;
                        break;

                case 6:
                        if ( Nr2 && Nr3 )
                            S++;
                        break;

                default: break;
            }
        }

            int i = R / 2;

            Nr2 = Legendre( R, 2) - Legendre( i, 2) - Legendre( R - i, 2);
            Nr3 = Legendre( R, 3) - Legendre( i, 3) - Legendre( R - i, 3);
            Nr5 = Legendre( R, 5) - Legendre( i, 5) - Legendre( R - i, 5);

            S <<= 1;

            switch( D ){


                case 2:
                        if ( Nr2 )
                            S++;
                        break;

                case 3:
                        if ( Nr3 )
                            S++;
                        break;

                case 4:
                        if ( Nr2 > 1 )
                            S++;
                        break;

                case 5:
                        if ( Nr5 )
                            S++;
                        break;

                case 6:
                        if ( Nr2 && Nr3 )
                            S++;
                        break;

                default: break;
        }
    }
}

void citire(){

    ifstream f("pascal.in");

    f >> R >> D;

    f.close();
}

void afis(){

    ofstream g("pascal.out");

    g << S << "\n";

    g.close();
}

int main(){

    citire();
    rezolva();
    afis();

    return 0;
}