Your Ways

来源:互联网 发布:linux 查看组信息 编辑:程序博客网 时间:2024/05/16 09:10



 You live in a small well-planned rectangular town in Phuket. The size of the central area of the town is H kilometers x W kilometers. The central area is divided into HW unit blocks, each of size 1 x 1 km2. There are H + 1 streets going in the West to East direction, and there are W + 1 avenue going in the North-South direction. The central area can be seen as a rectangle on the plane, as shown below.

We can identify each intersection by its co-ordinate on the plane. For example, on the Figure above the bottom-left corner is intersection (0,0), and the top-right corner is intersection (6,3).
Your house is at the bottom-left corner (i.e., intersection (0,0)) and you want to go to the university at the top-right corner (i.e., intersection (W,H)). More over, you only want to go to the university with wasting any efforts; therefore, you only want to walk from West-to-East and South-to-North directions. Walking this way, in the example above there are 84 ways to reach the university.
You want to go to the university for K days. Things get more complicated when each morning, the city blocks parts of streets and avenues to do some cleaning. The blocking is done in such a way that it isnot possible to reach parts of the streets or avenues which is blocked from some other part which is blocked as well through any paths containingonly West-to-East and South-to-North walks.
You still want to go to the university usingthe same West-to-East and South-to-North strategy. You want to find out for each day, how many ways you can reach the university by only walking West-to-East and South-to-North. Since the number can be very big, we only want the resultmodulo 2552.

Input

The first line contains an integer T, the number of test cases (1 <= T <= 5). Each test case is in the following format.

The first line of each test case contains 3 integers: W, H, and K (1 <= W <= 1,000; 1 <= H <= 1,000; 1 <= K <= 10,000). W and H specify the size of the central area. K denotes the number of days you want to go to the university.
The next K lines describe the information on broken parts of streets and avenues. More specifically, line 1 + i, for 1 <= i <= K, starts with an integer Qi(1 <= Qi <= 100) denoting the number of parts which are blocked. Then Qi sets of 4 integers describing the blocked parts follow. Each part is described with 4 integers, A, B, C, and D (0 <= A <= C <= W; 0 <= B <= D <= H) meaning that the parts connecting intersection (A,B) and (C,D) is blocked. It is guaranteed that that part is a valid part of the streets or avenues, also C - A <= 1, and D – B <= 1, i.e., the part is 1 km long.

Output

For each test case, for each day, your program must output the number of ways to go to the universitymodulo 2552 on a separate line. i.e., the output for each test case must contains K lines.

Sample Input

22 2 31 0 0 0 12 1 0 2 0 0 2 1 21 1 1 2 1100 150 21 99 150 100 1502 99 150 100 150 100 149 100 150

Sample Output

34415620

Hint

The amount of I/O for this task is quite large. Therefore, when reading input, you should avoid using java.io.Scanner which is much slower than using java.io.BufferedReader. 

The blocking is done in such a way that it is not possible to reach parts of the streets or avenues which is blocked from some other part which is blocked as well through any paths containingonly West-to-East and South-to-North walks.

这句话的意思是每条不能走的道路不会相互影响!所以可以用总数 - 两个端点所能到达的情况数!

<span style="font-size:14px;color:#ff0000;">#include<iostream>#include<stack>#include<algorithm>#include<string.h>#include<math.h>#include<stdio.h>using namespace std;struct node{    int x1,y1,x2,y2;}N[305];int dp[1005][1005];int main(){    int t;    cin>>t;    while(t--)    {        int m,n,k;        cin>>m>>n>>k;        for(int i=0;i<=(m>n?m:n);i++)            dp[i][0] = dp[0][i] = 1;        for(int i=1;i<=n;i++)            for(int j=1;j<=m;j++)        {            dp[i][j] = (dp[i-1][j] + dp[i][j-1])%2552;        }        while(k--)        {            int ans = dp[n][m];            int a;            cin>>a;            for(int i=0;i<a;i++)            {                cin>>N[i].x1>>N[i].y1>>N[i].x2>>N[i].y2;                ans -= dp[N[i].y1][N[i].x1] * dp[n-N[i].y2][m-N[i].x2];                ans = (ans+2552)%2552;            }        if(ans < 0)            ans += 2552;           cout<<ans<<endl;        }    }    return 0;}</span>

0 0