#include<bits/stdc++.h>
using namespace std;
#define MAXN 10
long ans_cnt;
short Qcnt, Rcnt, Bcnt;
short Board_Len, QRcnt;
short now_row[MAXN]; // 宣告成全域變數,只有當PutQR會用到
short nslash[MAXN<<1]; //+0 - +9
short pslash[MAXN<<1]; //-9 - +9
bool Col[MAXN]; //+0 - +9
bool Row[MAXN]; //+0 - +9
short *NS=&nslash[0]; // x+y:/
short *PS=&pslash[9]; // x-y:\
vector<short> white; // 紀錄有『選項』的#NS
vector<short> black; // 紀錄有『選項』的#NS
vector<short> Slash_pick[MAXN<<1]; // 紀錄#NS的『選項』
long whiteCnt[11];
long blackCnt[10];
// Row從(0,N-1)中選取QRcnt個當作Queen和Rook要放的#Row
void New_QueenRookMap(int now,int st);
// 枚舉選取的Row依序放入Queen或是Rook
void PutQueenRook(int nowR,int Q,int R);
// 將棋盤轉45度後枚舉#NS,對於每個#NS枚舉#PS
// (未做)Cut-Branch:將奇偶數分開計算(因為不會互相干擾,證明請參考a682的動態規劃解法)
void Bishop_Count();
void PutBishop(int idxS,int Bishop,vector<short> &Slash_memo,long *cnt);
int main(){
ios::sync_with_stdio(0),
cin.tie(0), cout.tie(0);
while(cin>>Qcnt>>Rcnt>>Bcnt){
QRcnt=Qcnt+Rcnt;
Board_Len=QRcnt+Bcnt;
ans_cnt=0;
New_QueenRookMap(0,0);
cout<<ans_cnt<<endl;
}
}
void New_QueenRookMap(int now,int st){
if(now==QRcnt){ // 已經「成功」選取QRcnt個#Row
// init
fill(Col,Col+Board_Len,0);
fill(NS,NS+(Board_Len<<1),0);
fill(PS-Board_Len,PS+Board_Len,0);
// 枚舉每個選取的Row依序放入Queen和Rook
PutQueenRook(0,Qcnt,Rcnt);
return;
}
for(short i=st;i<=Board_Len-QRcnt+now;i++)
now_row[now]=i,
New_QueenRookMap(now+1,i+1);
}
void PutQueenRook(int idxR,int Queen,int Rook){
if(idxR==QRcnt){ Bishop_Count(); return; }
short nowR=now_row[idxR]; // 根據now_row[idx]轉為目前是#Row
for(short i=0;i<Board_Len;i++) //枚舉每個Column,選擇沒被佔走的放上棋子
if(!Col[i]){
Col[i]=1;
// PutQueen:把兩側的對角線方程式數值設定成Board_Len
if(Queen>0 and !NS[nowR+i] and !PS[nowR-i]){
NS[nowR+i]=PS[nowR-i]=Board_Len;
PutQueenRook(idxR+1,Queen-1,Rook);
NS[nowR+i]=PS[nowR-i]=0;
}
// PutRook:把兩側的對角線方程式數值+1, 這樣回朔時-1
if(Rook>0 and NS[nowR+i]<Board_Len and PS[nowR-i]<Board_Len){
NS[nowR+i]++, PS[nowR-i]++;
PutQueenRook(idxR+1,Queen,Rook-1);
NS[nowR+i]--, PS[nowR-i]--;
}
Col[i]=0;
}
}
void Bishop_Count(){
// init
for(short i=0;i<(Board_Len<<1);i++) // 清空每個#NS的選項
Slash_pick[i].clear();
fill(Row,Row+Board_Len,0); // 將PutQueenRook時的#Row標示為已經選取的狀態
for(short i=0;i<QRcnt;i++)
Row[ now_row[i] ]=1;
// 枚舉棋盤的所有格子,對於『合法空格』依序分配到對應的#NS作為選項
for(int r=0;r<Board_Len;r++)
if(!Row[r])
for(int c=0;c<Board_Len;c++)
if(!Col[c] and !NS[r+c] and !PS[r-c])
Slash_pick[r+c].push_back(r-c);
// 紀錄有『選項』的#NS
white.clear();
black.clear();
for(int i=0;i<(Board_Len<<1);i++)
if(Slash_pick[i].size())
(i&1)? black.push_back(i): white.push_back(i);
memset(whiteCnt,0,sizeof(whiteCnt));
memset(blackCnt,0,sizeof(blackCnt));
PutBishop(0,0,white,whiteCnt);
PutBishop(0,0,black,blackCnt);
for(int i=0;i<=Bcnt;i++)
ans_cnt+=whiteCnt[i]*blackCnt[Bcnt-i];
}
void PutBishop(int idxS,int Bishop,vector<short> &Slash_memo,long *cnt){
if(idxS==Slash_memo.size()){ cnt[Bishop]++; return; }
PutBishop(idxS+1,Bishop,Slash_memo,cnt);
short nowS=Slash_memo[idxS];
for(short i=0;i<Slash_pick[nowS].size();i++)
if(!PS[ Slash_pick[nowS][i] ])
PS[ Slash_pick[nowS][i] ]=1,
PutBishop(idxS+1,Bishop+1,Slash_memo,cnt),
PS[ Slash_pick[nowS][i] ]=0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBNQVhOIDEwCgpsb25nIGFuc19jbnQ7CnNob3J0IFFjbnQsIFJjbnQsIEJjbnQ7CnNob3J0IEJvYXJkX0xlbiwgUVJjbnQ7CgpzaG9ydCBub3dfcm93W01BWE5dOyAgIC8vIOWuo+WRiuaIkOWFqOWfn+iuiuaVuO+8jOWPquacieeVtlB1dFFS5pyD55So5YiwCnNob3J0IG5zbGFzaFtNQVhOPDwxXTsgLy8rMCAtICs5CnNob3J0IHBzbGFzaFtNQVhOPDwxXTsgLy8tOSAtICs5CmJvb2wgQ29sW01BWE5dOyAgICAgICAgLy8rMCAtICs5CmJvb2wgUm93W01BWE5dOyAgICAgICAgLy8rMCAtICs5CnNob3J0ICpOUz0mbnNsYXNoWzBdOyAgLy8geCt577yaLwpzaG9ydCAqUFM9JnBzbGFzaFs5XTsgIC8vIHgtee+8mlwKCnZlY3RvcjxzaG9ydD4gd2hpdGU7IC8vIOe0gOmMhOacieOAjumBuOmgheOAj+eahCNOUwp2ZWN0b3I8c2hvcnQ+IGJsYWNrOyAvLyDntIDpjITmnInjgI7pgbjpoIXjgI/nmoQjTlMKdmVjdG9yPHNob3J0PiBTbGFzaF9waWNrW01BWE48PDFdOyAvLyDntIDpjIQjTlPnmoTjgI7pgbjpoIXjgI8KbG9uZyB3aGl0ZUNudFsxMV07CmxvbmcgYmxhY2tDbnRbMTBdOwoKLy8gUm935b6eKDAsTi0xKeS4remBuOWPllFSY2505YCL55W25L2cUXVlZW7lkoxSb29r6KaB5pS+55qEI1Jvdwp2b2lkIE5ld19RdWVlblJvb2tNYXAoaW50IG5vdyxpbnQgc3QpOwoKLy8g5p6a6IiJ6YG45Y+W55qEUm935L6d5bqP5pS+5YWlUXVlZW7miJbmmK9Sb29rCnZvaWQgUHV0UXVlZW5Sb29rKGludCBub3dSLGludCBRLGludCBSKTsKCi8vIOWwh+aji+ebpOi9iTQ15bqm5b6M5p6a6IiJI05T77yM5bCN5pa85q+P5YCLI05T5p6a6IiJI1BTCi8vICjmnKrlgZopQ3V0LUJyYW5jaO+8muWwh+Wlh+WBtuaVuOWIhumWi+ioiOeulyjlm6DngrrkuI3mnIPkupLnm7jlubLmk77vvIzorYnmmI7oq4vlj4PogINhNjgy55qE5YuV5oWL6KaP5YqD6Kej5rOVKQp2b2lkIEJpc2hvcF9Db3VudCgpOwp2b2lkIFB1dEJpc2hvcChpbnQgaWR4UyxpbnQgQmlzaG9wLHZlY3RvcjxzaG9ydD4gJlNsYXNoX21lbW8sbG9uZyAqY250KTsKCmludCBtYWluKCl7CiAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCksCiAgY2luLnRpZSgwKSwgY291dC50aWUoMCk7CgogIHdoaWxlKGNpbj4+UWNudD4+UmNudD4+QmNudCl7CgogICAgUVJjbnQ9UWNudCtSY250OwogICAgQm9hcmRfTGVuPVFSY250K0JjbnQ7CgogICAgYW5zX2NudD0wOwogICAgTmV3X1F1ZWVuUm9va01hcCgwLDApOwoKICAgIGNvdXQ8PGFuc19jbnQ8PGVuZGw7CiAgfQp9CnZvaWQgTmV3X1F1ZWVuUm9va01hcChpbnQgbm93LGludCBzdCl7CiAgaWYobm93PT1RUmNudCl7IC8vIOW3sue2k+OAjOaIkOWKn+OAjemBuOWPllFSY2505YCLI1JvdwogICAgLy8gaW5pdAogICAgZmlsbChDb2wsQ29sK0JvYXJkX0xlbiwwKTsKICAgIGZpbGwoTlMsTlMrKEJvYXJkX0xlbjw8MSksMCk7CiAgICBmaWxsKFBTLUJvYXJkX0xlbixQUytCb2FyZF9MZW4sMCk7CiAgICAvLyDmnproiInmr4/lgIvpgbjlj5bnmoRSb3fkvp3luo/mlL7lhaVRdWVlbuWSjFJvb2sKICAgIFB1dFF1ZWVuUm9vaygwLFFjbnQsUmNudCk7CiAgICByZXR1cm47CiAgfQogIGZvcihzaG9ydCBpPXN0O2k8PUJvYXJkX0xlbi1RUmNudCtub3c7aSsrKQogICAgbm93X3Jvd1tub3ddPWksCiAgICBOZXdfUXVlZW5Sb29rTWFwKG5vdysxLGkrMSk7Cn0Kdm9pZCBQdXRRdWVlblJvb2soaW50IGlkeFIsaW50IFF1ZWVuLGludCBSb29rKXsKICBpZihpZHhSPT1RUmNudCl7IEJpc2hvcF9Db3VudCgpOyByZXR1cm47IH0KICBzaG9ydCBub3dSPW5vd19yb3dbaWR4Ul07ICAgICAgLy8g5qC55pOabm93X3Jvd1tpZHhd6L2J54K655uu5YmN5pivI1JvdwogIGZvcihzaG9ydCBpPTA7aTxCb2FyZF9MZW47aSsrKSAvL+aemuiIieavj+WAi0NvbHVtbu+8jOmBuOaTh+aykuiiq+S9lOi1sOeahOaUvuS4iuaji+WtkAogICAgaWYoIUNvbFtpXSl7CiAgICAgIENvbFtpXT0xOwogICAgICAvLyBQdXRRdWVlbu+8muaKiuWFqeWBtOeahOWwjeinkue3muaWueeoi+W8j+aVuOWAvOioreWumuaIkEJvYXJkX0xlbgogICAgICBpZihRdWVlbj4wIGFuZCAhTlNbbm93UitpXSBhbmQgIVBTW25vd1ItaV0pewogICAgICAgIE5TW25vd1IraV09UFNbbm93Ui1pXT1Cb2FyZF9MZW47CiAgICAgICAgUHV0UXVlZW5Sb29rKGlkeFIrMSxRdWVlbi0xLFJvb2spOwogICAgICAgIE5TW25vd1IraV09UFNbbm93Ui1pXT0wOwogICAgICB9CiAgICAgIC8vIFB1dFJvb2vvvJrmiorlhanlgbTnmoTlsI3op5Lnt5rmlrnnqIvlvI/mlbjlgLwrMSwg6YCZ5qij5Zue5pyU5pmCLTEKICAgICAgaWYoUm9vaz4wIGFuZCBOU1tub3dSK2ldPEJvYXJkX0xlbiBhbmQgUFNbbm93Ui1pXTxCb2FyZF9MZW4pewogICAgICAgIE5TW25vd1IraV0rKywgUFNbbm93Ui1pXSsrOwogICAgICAgIFB1dFF1ZWVuUm9vayhpZHhSKzEsUXVlZW4sUm9vay0xKTsKICAgICAgICBOU1tub3dSK2ldLS0sIFBTW25vd1ItaV0tLTsKICAgICAgfQogICAgICBDb2xbaV09MDsKICAgIH0KfQp2b2lkIEJpc2hvcF9Db3VudCgpewogIC8vIGluaXQKICBmb3Ioc2hvcnQgaT0wO2k8KEJvYXJkX0xlbjw8MSk7aSsrKSAvLyDmuIXnqbrmr4/lgIsjTlPnmoTpgbjpoIUKICAgIFNsYXNoX3BpY2tbaV0uY2xlYXIoKTsKICBmaWxsKFJvdyxSb3crQm9hcmRfTGVuLDApOyAvLyDlsIdQdXRRdWVlblJvb2vmmYLnmoQjUm935qiZ56S654K65bey57aT6YG45Y+W55qE54uA5oWLCiAgZm9yKHNob3J0ICBpPTA7aTxRUmNudDtpKyspCiAgICBSb3dbIG5vd19yb3dbaV0gXT0xOwogIC8vIOaemuiIieaji+ebpOeahOaJgOacieagvOWtkO+8jOWwjeaWvOOAjuWQiOazleepuuagvOOAj+S+neW6j+WIhumFjeWIsOWwjeaHieeahCNOU+S9nOeCuumBuOmghQogIGZvcihpbnQgcj0wO3I8Qm9hcmRfTGVuO3IrKykKICAgIGlmKCFSb3dbcl0pCiAgICAgIGZvcihpbnQgYz0wO2M8Qm9hcmRfTGVuO2MrKykKICAgICAgICBpZighQ29sW2NdIGFuZCAhTlNbcitjXSBhbmQgIVBTW3ItY10pCiAgICAgICAgICBTbGFzaF9waWNrW3IrY10ucHVzaF9iYWNrKHItYyk7CiAgLy8g57SA6YyE5pyJ44CO6YG46aCF44CP55qEI05TCiAgd2hpdGUuY2xlYXIoKTsKICBibGFjay5jbGVhcigpOwogIGZvcihpbnQgaT0wO2k8KEJvYXJkX0xlbjw8MSk7aSsrKQogICAgaWYoU2xhc2hfcGlja1tpXS5zaXplKCkpCiAgICAgIChpJjEpPyBibGFjay5wdXNoX2JhY2soaSk6IHdoaXRlLnB1c2hfYmFjayhpKTsKCiAgbWVtc2V0KHdoaXRlQ250LDAsc2l6ZW9mKHdoaXRlQ250KSk7CiAgbWVtc2V0KGJsYWNrQ250LDAsc2l6ZW9mKGJsYWNrQ250KSk7CiAgUHV0QmlzaG9wKDAsMCx3aGl0ZSx3aGl0ZUNudCk7CiAgUHV0QmlzaG9wKDAsMCxibGFjayxibGFja0NudCk7CgogIGZvcihpbnQgaT0wO2k8PUJjbnQ7aSsrKQogICAgYW5zX2NudCs9d2hpdGVDbnRbaV0qYmxhY2tDbnRbQmNudC1pXTsKfQp2b2lkIFB1dEJpc2hvcChpbnQgaWR4UyxpbnQgQmlzaG9wLHZlY3RvcjxzaG9ydD4gJlNsYXNoX21lbW8sbG9uZyAqY250KXsKICBpZihpZHhTPT1TbGFzaF9tZW1vLnNpemUoKSl7IGNudFtCaXNob3BdKys7IHJldHVybjsgfQogIFB1dEJpc2hvcChpZHhTKzEsQmlzaG9wLFNsYXNoX21lbW8sY250KTsKICBzaG9ydCBub3dTPVNsYXNoX21lbW9baWR4U107CiAgZm9yKHNob3J0IGk9MDtpPFNsYXNoX3BpY2tbbm93U10uc2l6ZSgpO2krKykKICAgIGlmKCFQU1sgU2xhc2hfcGlja1tub3dTXVtpXSBdKQogICAgICBQU1sgU2xhc2hfcGlja1tub3dTXVtpXSBdPTEsCiAgICAgIFB1dEJpc2hvcChpZHhTKzEsQmlzaG9wKzEsU2xhc2hfbWVtbyxjbnQpLAogICAgICBQU1sgU2xhc2hfcGlja1tub3dTXVtpXSBdPTA7Cn0K