【组合数学】TopCoder SRM555 XorBoard

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>

#define SIZE 4000
#define mod 555555555

using namespace std;

class XorBoard {
public:
	int combi[4000][4000];
	int count(int, int, int, int, int);
};

int XorBoard::count(int H, int W, int Rcount, int Ccount, int S) {
		
		for(int i=0;i<4000;i++)
		for(int j=0;j<4000;j++)
			combi[i][j]=0;
		//start from 0, or you will get wrong answer
		for(int i=0;i<3600;i++){
			combi[i][0]=1;
			//start from 0 will cause sementation fault
			for(int j=1;j<=i;j++){
				combi[i][j]=(combi[i-1][j]+combi[i-1][j-1])%mod;
			}
		}

		long long result=0;
		for(int row=0;row<=min(H,Rcount);row++){
			if( ((Rcount-row)%2) !=0)
				continue;
			for(int col=0;col<=min(W,Ccount);col++){
				if((Ccount-col)%2!=0)
					continue;
				if((row*W+col*H-2*row*col)!=S)
					continue;
				long long tmp=((long long)combi[H][row]*combi[(Rcount-row)/2+H-1][H-1])%mod;
				tmp=(tmp*combi[W][col])%mod;
				tmp=(tmp*combi[(Ccount-col)/2+W-1][W-1])%mod;
				result=(result+tmp)%mod;
			}
		}
		
		result=(result+mod)%mod;

		return result;
}//end count

一开始代码有问题,后来才发现,是一个非常隐蔽的错误,是因为在做乘法的时候没有做数据类型的转换(tmp定义的那行,少了long long 就错了……),第一次碰到这种错误,实在是深刻的教训。


你可能感兴趣的:(【组合数学】TopCoder SRM555 XorBoard)