【组合数学】TopCoder SRM555 XorBoard

来源:互联网 发布:威纳数据 编辑:程序博客网 时间:2024/05/21 09:17

#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 555555555using 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 answerfor(int i=0;i<3600;i++){combi[i][0]=1;//start from 0 will cause sementation faultfor(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 就错了……),第一次碰到这种错误,实在是深刻的教训。