Problem Description
冬天到了,佳佳想去河上滑冰,但是渔民打鱼的时候在河面上开了好多冰洞。假设佳佳开始的位置为(0,0),想要滑行到(N,M)的位置。冰洞的位置已经勘察好了,在(X1,Y1),(X2,Y2),…,(XK,YK)的位置,佳佳技术不好只能绕过冰洞,并且佳佳每次只能沿着x轴或y轴的正方向移动距离1,统计一下佳佳可以有多少条路线。
Input
输入的第一行为一个整数T (1<=T<=50),表示测试用例的个数。
接下来输入T组数据,每组数据为:
第一行,两个整数N和M( N,M<=100,00 )。
第二行,一个整数K(K<=1000)表示有K个障碍。
第3到K+3行,2个整数Xi和Yi。
Output
输出T行数据,每行一个整数,表示不同移动方式的数量除以124567的余数。
Sample Input
1
1 3
1
1 2
Sample Output
1
代码还未来的及提交 仅供参考 如有错误 欢迎指出 不胜感激
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<climits>
#include<algorithm>
using namespace std;
const int N=20000+10;
const int K=1000+10;
int a[N];
struct node{
int x,y;
};
void init()
{
a[1]=1;
for(int i=2; i<N; i++)
{
a[i]=(a[i-1]*i)%1234567;
}
}
int aa(int p,int q)
{
return a[p+q]/a[p]/a[q];
}
bool cop(node aa,node bb)
{
if(aa.x<=bb.x&&aa.y<=bb.y)
return true;
return false;
}
int main()
{
init();
node xj[1010];
int tcase;
scanf("%d",&tcase);
while(tcase--)
{
int n,m,k;
scanf("%d%d",&n,&m);
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%d%d",&xj[i].x,&xj[i].y);
}
sort(xj,xj+k,cop);
int dao[1010];
dao[0]=aa(xj[0].x,xj[0].y);
for(int i=1;i<k;i++)
{
dao[i]=aa(xj[i].x,xj[i].y);
for(int j=0;j<i;j++)
{
if(cop(xj[j],xj[i]))
dao[i]-=dao[j]*aa(xj[i].x-xj[j].x,xj[i].y-xj[j].y);
}
}
int res=aa(n,m);
for(int i=0;i<k;i++)
{
if(xj[i].x<=n&&xj[i].y<=m)
{
res=res-dao[i]*aa(n-xj[i].x,m-xj[i].y);
}
}
printf("%d\n",res);
}
return 0;
}