| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
雁过留声——排列组合,耐心枚举本来想搞dp的,不过发现几乎无法达到。
无奈中,突发奇想:可以用数学。
如果意识到了其实没有几种“本质不同”的路线,那么就离AC不远了。
其实,可以枚举到达目的地时的方向,
再枚举绕圈的数量,最后排列组合一下,就OK了。
如果不耐心计算,WA是没的说的。
具体的公式可以看代码吧:
void MultiC(int &r,int a,int b){
r=int(((long long)r*(long long)C[a][b])%(long long)MODULO);
}
void Calc(int &r,int a,int aa,int b,int bb,int c,int cc,int d,int dd){
int t;
t=1;
MultiC(t,aa,a);
MultiC(t,bb,b);
MultiC(t,cc,c);
MultiC(t,dd,d);
r=(r+t)%MODULO;
}
ret=0;
//down
for (int i=0;i<=x-1 && i<=X-x && i<=y && i+1<=Y-y;i++)
Calc(ret,i,x-1,i,X-x,i,y,i+1,Y-y);
//right
for (int i=0;i<=x-1 && i<=X-x && i<=y && i<=Y-y;i++)
Calc(ret,i,x-1,i,X-x,i,y,i,Y-y);
//up
for (int i=0;i<=x-1 && i+1<=X-x && i+1<=y && i+1<=Y-y;i++)
Calc(ret,i,x-1,i+1,X-x,i+1,y,i+1,Y-y);
//left
for (int i=0;i<=x-1 && i+1<=X-x && i<=y && i+1<=Y-y;i++)
Calc(ret,i,x-1,i+1,X-x,i,y,i+1,Y-y);
if (y && !x)ret=(ret+1)%MODULO;
if (!y && !x)ret=(ret+1)%MODULO;
printf("%d\n",ret);
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator