Cod sursa(job #494934)

Utilizator SpiderManSimoiu Robert SpiderMan Data 23 octombrie 2010 13:17:51
Problema Dreptunghiuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
# include <cstdio>

typedef long long ll ;
const char *FIN = "dreptunghiuri.in", *FOU = "dreptunghiuri.out" ;
const int MAX = 404 ;

int V[MAX][MAX] ;
int pow[MAX * MAX] ;
int N, M ;
ll sol ;

void swap ( int &i, int &j ) {
    int aux = i ;
    i = j ;
    j = aux ;
}

int main ( void ) {
    fscanf ( fopen ( FIN, "r" ) , "%d %d", &M, &N ) ;

    if ( M > N ) {
        swap ( M, N ) ;
    }
    for ( int i = 1; i < N; ++i ) {
        pow[i * i] = i ;
    }

    for ( int i = 1; i < M; ++i ) {
        for ( int j = 1; j < N; ++j ) {
            if ( i <= j ) {
                for ( int k = 0; k < i; ++k ) {
                    int d = j * j - 4 * k * ( i - k ) ;

                    if ( d < 0 || ( d && pow[ d ] == 0 ) ) {
                        continue ;
                    }
                        d = pow[ d ] ;
                        int X1 = j - d >> 1, X2 = j + d >> 1 ;
                        X1 >= 0 && X1 < j ? ++V[i][j] : 0 ;
                        X2 >= 0 && X2 < j && X2 != X1 ? ++V[i][j] : 0 ;
                }
            } else {
                V[i][j] = V[j][i] ;
            }
            sol += static_cast < ll > ( ( M - i ) * ( N - j ) * V[i][j] ) ;
        }
    }

    fprintf ( fopen ( FOU, "w" ) , "%lld", sol ) ;
}