Cod sursa(job #2398089)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 5 aprilie 2019 02:49:55
Problema Diamant Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#define MOD 10000

using namespace std ;

ofstream g ("diamant.out") ;

int v [ 44105 ] ;

 class InParser {
private:
	FILE *fin;
	char *buff;
	int sp;

	char read_ch() {
		++sp;
		if (sp == 4096) {
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}

public:
	InParser(const char* nume) {
		fin = fopen(nume, "r");
		buff = new char[4096]();
		sp = 4095;
	}

	InParser& operator >> (int &n) {
		char c;
		while (!isdigit(c = read_ch()) && c != '-');
		int sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}

	InParser& operator >> (long long &n) {
		char c;
		n = 0;
		while (!isdigit(c = read_ch()) && c != '-');
		long long sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
};

int main ()
{
     InParser f ("diamant.in");

    long long s = 0 , l ;

    int n , m ; f >> n >> m >> l ;


    if ( l < 0 )    l *= -1 ;

    v [ 0 ] = 1 ;

    for ( int i = 1 ; i <= n ; ++ i )
    for ( int j = 1 ; j <= m ; ++ j )
    s += i * j ;


    if ( l > s )    { g << 0 ; return 0 ; }
    if ( s == l )   { g << 1 ; return 0 ; }

    s -= l ;

    for ( int i = 1 ; i <= n ; ++ i )
    for ( int j = 1 ; j <= m ; ++ j )

    for ( int k = s ; k >= i * j ; -- k )
    {

        v [ k ] += v [ k - i * j ] ;
        if ( k >= 2 * i * j )   v [ k ] += v [ k - 2 * i * j ] ;
        v [ k ] %= MOD ;
    }

    g << v [ s ] << "\n" ;

    return 0 ;
}