Cod sursa(job #1033910)

Utilizator Teodor94Teodor Plop Teodor94 Data 17 noiembrie 2013 16:23:35
Problema Dtcsu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>

#define TOTAL 276997
#define LEN 20
#define MAX_N 1000000000000000000
#define ll long long

char s[LEN];
ll power[5][60];
int nr[5] = { 2, 3, 5, 7, 11 };
int exp[5] = { 59, 37, 25, 21, 17 };
int p[5] = { 32, 32, 16, 16, 16 };

bool is_digit( char c ) {
    return c >= '0' && c <= '9';
}

ll get_int( char A[] ) {
    ll x = 0;
    int i = 0;
    while ( is_digit( A[i] ) ) {
        x = ( ll ) x * 10 + ( A[i] - '0' );
        ++i;
    }
    return x;
}

void read( FILE *fin ) {
    for ( int i = 0; i < TOTAL; ++i )
        fgets( s, LEN, fin );
}

void pregen() {
    for ( int i = 0; i < 5; ++i )
        power[i][0] = 1;
    for ( int i = 0; i < 5; ++i )
        for ( int j = 1; j <= exp[i]; ++j )
            power[i][j] = ( ll ) power[i][j - 1] * nr[i];
}

int main() {
    FILE *fin, *fout;

    fin = fopen( "dtcsu.in", "r" );
    fout = fopen( "dtcsu.out", "w" );

    read( fin );
    pregen();
    
    int q, ans = 0;
    fscanf( fin, "%d\n", &q );
    while ( q ) {
        fgets( s, LEN, fin );
        ll x = get_int( s );
        
        for ( int i = 0; i < 5; ++i ) {
            int j = p[i];
            while ( j ) {
                if ( x % power[i][j] == 0 )
                    x /= power[i][j];
                j >>= 1;
            }

            if ( x == 1 ) {
                ++ans;
                break;
            }
        }
        
        --q;
    }
    
    fprintf( fout, "%d\n", ans );
    fclose( fin );
    fclose( fout );
}