Posted onSymbols count in article: 1.6kReading time ≈6 mins.
Problem
Sightseeing Plan
Timelimit:8Sec Memorylimit:256MB
Statement
Joisino is planning on touring Takahashi Town. The town is divided into square sections by north-south and east-west lines. We will refer to the section that is the xth from the west and the yth from the north as (x,y).
Joisino thinks that a touring plan is good if it satisfies the following conditions:
Let (p,q) be the section where she starts the tour. Then, X1≤p≤X2 and Y1≤q≤Y2 hold.
Let (s,t) be the section where she has lunch. Then, X3≤s≤X4 and Y3≤t≤Y4 hold.
Let (u,v) be the section where she ends the tour. Then, X5≤u≤X6 and Y5≤v≤Y6 hold.
By repeatedly moving to the adjacent section (sharing a side), she travels from the starting section to the ending section in the shortest distance, passing the lunch section on the way.
Two touring plans are considered different if at least one of the following is different: the starting section, the lunch section, the ending section, and the sections that are visited on the way. Joisino would like to know how many different good touring plans there are. Find the number of the different good touring plans. Since it may be extremely large, find the count modulo 109+7.
Input is given from Standard Input in the following format:
X1Y1X2Y2X3Y3X4Y4X5Y5X6Y6
Output
Print the number of the different good touring plans, modulo 109+7.
Sample
Input #1
1 2
1 1 2 2 3 4 1 1 2 2 3 3
Output #1
1
10
Explanation #1
The starting section will always be (1,1), and the lunch section will always be (2,2). There are four good touring plans where (3,3) is the ending section, and six good touring plans where (4,3) is the ending section. Therefore, the answer is 6+4=10. Input #2
#include<bits/stdc++.h> #define MX 2000000 #define P 1000000007 usingnamespace std; typedeflonglong lnt; template <classT> inlinevoidread(T &x){ x = 0; int c = getchar(), f = 1; for (; !isdigit(c); c = getchar()) if (c == 45) f = -1; for (; isdigit(c); c = getchar()) (x *= 10) += f*(c-'0'); } lnt fac[MX+5], inv[MX+5]; int X1, X2, X3, X4, X5, X6; int Y1, Y2, Y3, Y4, Y5, Y6; voidinit(){ fac[0] = inv[0] = inv[1] = 1; for (int i = 1; i <= MX; i++) fac[i] = fac[i-1]*i%P; for (int i = 2; i <= MX; i++) inv[i] = (P-P/i*inv[P%i]%P)%P; for (int i = 2; i <= MX; i++) inv[i] = inv[i]*inv[i-1]%P; } lnt F(int n, int m){return fac[n+m]*inv[n]%P*inv[m]%P;} lnt calc(int sx, int sy, int tx, int ty){ lnt ret = 0; for (int x = X3, y = Y3; x <= X4; x++) ret = (ret+1LL*(P-x-y)*F(x-sx, y-sy-1)%P*F(tx-x, ty-y)%P)%P; for (int x = X3, y = Y3; y <= Y4; y++) ret = (ret+1LL*(P-x-y)*F(x-sx-1, y-sy)%P*F(tx-x, ty-y)%P)%P; for (int x = X3, y = Y4; x <= X4; x++) ret = (ret+1LL*(x+y+1)*F(x-sx, y-sy)%P*F(tx-x, ty-y-1)%P)%P; for (int x = X4, y = Y3; y <= Y4; y++) ret = (ret+1LL*(x+y+1)*F(x-sx, y-sy)%P*F(tx-x-1, ty-y)%P)%P; return ret; } intmain(){ init(); lnt ans = 0; read(X1), read(X2), read(X3), read(X4), read(X5), read(X6); read(Y1), read(Y2), read(Y3), read(Y4), read(Y5), read(Y6); ans = (ans+calc(X1-1, Y1-1, X5, Y5))%P; ans = (ans+calc(X1-1, Y1-1, X6+1, Y6+1))%P; ans = (ans-calc(X1-1, Y1-1, X5, Y6+1)+P)%P; ans = (ans-calc(X1-1, Y1-1, X6+1, Y5)+P)%P; ans = (ans+calc(X2, Y2, X5, Y5))%P; ans = (ans+calc(X2, Y2, X6+1, Y6+1))%P; ans = (ans-calc(X2, Y2, X5, Y6+1)+P)%P; ans = (ans-calc(X2, Y2, X6+1, Y5)+P)%P; ans = (ans-calc(X1-1, Y2, X5, Y5)+P)%P; ans = (ans-calc(X1-1, Y2, X6+1, Y6+1)+P)%P; ans = (ans+calc(X1-1, Y2, X5, Y6+1))%P; ans = (ans+calc(X1-1, Y2, X6+1, Y5))%P; ans = (ans-calc(X2, Y1-1, X5, Y5)+P)%P; ans = (ans-calc(X2, Y1-1, X6+1, Y6+1)+P)%P; ans = (ans+calc(X2, Y1-1, X5, Y6+1))%P; ans = (ans+calc(X2, Y1-1, X6+1, Y5))%P; returnprintf("%lld\n", ans), 0; }