Cod sursa(job #2314243)

Utilizator cipri321Marin Ciprian cipri321 Data 8 ianuarie 2019 10:50:54
Problema Diamant Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <fstream>
#include <cstring>
#define DN 21
#define ADD 44100
#define MOD 10000
using namespace std;
ifstream fi("diamant.in");
ofstream fo("diamant.out");
int n,m,x;
short int dp[2][90000];
int lim;
inline void add(short int &a,short int b)
{
	a+=b;
	if(a>=MOD)
		a-=MOD;
}
int main()
{
	fi>>n>>m>>x;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			lim+=i*j;
	dp[0][ADD]=1;
	for(int i=1,ind=1;i<=n*m;i++,ind^=1)
	{
		int l=i/m+1,c=i%m;
		if(c==0)
			l--,c=m;
		memset(dp[ind],0,sizeof(dp[ind]));
		for(int sum=(-lim);sum<=lim;sum++)
		{
			if(sum-l*c>=(-lim))
				add(dp[ind][sum+ADD],dp[ind^1][sum-l*c+ADD]);
			if(sum+l*c<=lim)
				add(dp[ind][sum+ADD],dp[ind^1][sum+l*c+ADD]);
			add(dp[ind][sum+ADD],dp[ind^1][sum+ADD]);
		}
	}
	if(x>lim||x<(-lim))
		fo<<0;
	else
		fo<<dp[(n*m)%2][x+ADD];
	fi.close();
	fo.close();
	return 0;
}