#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 就错了……),第一次碰到这种错误,实在是深刻的教训。