Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<vector>
- #include<set>
- #include<map>
- #include<functional>
- #include<string>
- #include<cstring>
- #include<cstdlib>
- #include<queue>
- #include<utility>
- #include<fstream>
- #include<sstream>
- #include<cmath>
- #include<stack>
- #include<cstdio>
- #include <ctime>
- #include<cassert>
- using namespace std;
- #define MEM(a,b) memset(a,(b),sizeof(a))
- #define FOR(i, a, b) for(i=(a);i<=(b);i++)
- #define FORR(i, a, b) for(i=(a);i>=(b);i--)
- #define S(n) scanf("%d", &n)
- #define P(k) printf("%d\n", k)
- #define Pl(k) printf("%lld\n", k)
- #define pb push_back
- #define mp make_pair
- #define ll long long
- #define VI vector<int>
- #define PII pair<int, int>
- #define ft first
- #define sd second
- #define inf (1<<30)
- #define PNL primntf("\n")
- #define SP system("pause")
- #define MOD 1000000007
- #define PII pair<int, int>
- #define HAHA printf("HAHA\n")
- int blo[17][2];
- pair<int, int> obs[17];
- int ax, ay, bx, by, x, y, k, tail, a, b;
- ll c[2000][2000];
- bool occ[505];
- ll dp[505];
- ll C(int n, int m){
- if(n==0){
- if(m==0) return 1;
- else return 0;
- }
- if(m==0) return 1;
- assert(n<=2000 && m<=2000);
- if(c[n][m]!=-1) return c[n][m];
- c[n][m] = ( C(n-1, m) + C(n-1, m-1) ) % MOD;
- return c[n][m];
- }
- ll DP(int n){
- if(n<0) return 0;
- assert(n<505);
- if(dp[n]!= -1) return dp[n];
- dp[n] = (DP(n-a) + DP(n-b)) % MOD;
- return dp[n];
- }
- bool pappu(int p, int i, int z){
- if(p==0){
- assert(0<=i && i<17 && (z==0 || z==1));
- if(blo[i][z] == 0) return 1;
- else return 0;
- }
- else if(p>0){
- assert(0<=i && i<17 && (z==0 || z==1));
- if(blo[i][z]>=0 && blo[i][z]<=p) return 1;
- else return 0;
- }
- else{
- assert(0<=i && i<17 && (z==0 || z==1));
- if(blo[i][z]<=0 && blo[i][z]>=p) return 1;
- else return 0;
- }
- }
- int triv(int cx, int cy){
- int m;
- int i;
- if(cx==0){
- if(x!=0) return 0;
- if(y%(abs(cy))!=0) return 0;
- if(y/cy < 0) return 0;
- m = y / cy;
- FOR(i, 0, k-1){
- if(blo[i][0]==0 && blo[i][1]%(abs(cy))==0 && blo[i][1]/cy >= 0 && blo[i][1]/cy <= m) return 0;
- }
- return 1;
- }
- else if(cy==0){
- if(y!=0) return 0;
- if(x%(abs(cx))!=0) return 0;
- if(x/cx < 0) return 0;
- m = x / cx;
- FOR(i, 0, k-1){
- if(blo[i][1]==0 && blo[i][0]%(abs(cx))==0 && blo[i][0]/cx >= 0 && blo[i][0]/cx <= m) return 0;
- }
- return 1;
- }
- else{
- if(x%(abs(cx))!=0) return 0;
- if(y%(abs(cy))!=0) return 0;
- if(x/cx < 0) return 0;
- if(y/cy < 0) return 0;
- m = x / cx;
- int n = y / cy;
- FOR(i, 0, k-1){
- if(blo[i][0]%(abs(cx))==0 && blo[i][1]%(abs(cy))==0 && blo[i][0]/cx >= 0 && blo[i][0]/cx <= m && blo[i][1]/cy >= 0 && blo[i][1]/cy <= n) return 0;
- }
- return 1;
- }
- return 0;
- }
- int main(){
- int i, j, l, n, m, t;
- FOR(i, 0, 1999) FOR(j, 0, 1999) c[i][j] = -1;
- c[0][0] = 1;
- FOR(j, 1, 1999) c[0][j] = 0;
- FOR(i, 1, 1999) c[i][0] = 1;
- //srand ( time(NULL) );
- // t = 1;
- // x = -rand()%500;
- // y = rand()%500;
- // ax = rand()%500;
- // ay = -rand()%500;
- // bx = rand()%500;
- // by = -rand()%500;
- // k = 15;
- // FOR(i, 0, 14){
- // blo[i][0] = rand()%500;
- // blo[i][1] = rand()%500;
- // }
- S(t);
- while(t--){
- S(x); S(y); S(k);
- S(ax); S(ay); S(bx); S(by);
- FOR(i, 0, k-1){ S(blo[i][0]); S(blo[i][1]); }
- if(ax == 0 && ay == 0 && bx == 0 && by==0){ printf("0\n"); continue; }
- if(ax == 0 && ay == 0){ printf("%d\n", triv(bx, by)); continue; }
- if(bx == 0 && by == 0){ printf("%d\n", triv(ax, ay)); continue; }
- // now both vectors are non zero
- if(ax*by != ay*bx){
- //HAHA;
- if((x*by-y*bx)%(abs(ax*by-ay*bx)) != 0){ printf("0\n"); continue; }
- if((ax*y-ay*x)%(abs(ax*by-ay*bx)) != 0){ printf("0\n"); continue; }
- if((x*by-y*bx)/(ax*by-ay*bx) < 0){ printf("0\n"); continue; }
- if((ax*y-ay*x)/(ax*by-ay*bx) < 0){ printf("0\n"); continue; }
- a = (x*by-y*bx)/(ax*by-ay*bx);
- b = (ax*y-ay*x)/(ax*by-ay*bx);
- tail = 0;
- FOR(i, 0, k-1){
- if((blo[i][0]*by-blo[i][1]*bx)%(abs(ax*by-ay*bx)) == 0 &&
- (ax*blo[i][1]-ay*blo[i][0])%(abs(ax*by-ay*bx)) == 0 &&
- (blo[i][0]*by-blo[i][1]*bx)/(ax*by-ay*bx) >= 0 && (blo[i][0]*by-blo[i][1]*bx)/(ax*by-ay*bx) <= a &&
- (ax*blo[i][1]-ay*blo[i][0])/(ax*by-ay*bx) <= b &&
- (ax*blo[i][1]-ay*blo[i][0])/(ax*by-ay*bx) >= 0){ obs[tail].ft = (blo[i][0]*by-blo[i][1]*bx)/(ax*by-ay*bx); obs[tail++].sd = (ax*blo[i][1]-ay*blo[i][0])/(ax*by-ay*bx); }
- }
- sort(obs, obs + tail);
- tail--;
- int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15;
- ll ans = 0;
- //P(a); P(b);
- ans += C(a+b, b);
- //Pl(ans);
- ll temp = 0;
- FOR(i, 0, tail){
- int c = obs[i].ft;
- int d = obs[i].sd;
- //P(c); P(d);
- temp = (temp + C(c+d, d)*C(a-c+b-d, a-c)) % MOD;
- }
- ans -= temp;
- while(ans<0) ans += MOD;
- temp = 0;
- FOR(i, 0, tail) FOR(j, i+1, tail){
- int a1 = obs[i].ft; int b1 = obs[i].sd;
- int a2 = obs[j].ft; int b2 = obs[j].sd;
- if(b1>b2) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a-a2+b-b2, a-a2)) % MOD;
- }
- ans = (ans + temp) % MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- if(b1>b2 || b2>b3) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a-a3+b-b3, a-a3)) % MOD;
- }
- ans -= temp;
- while(ans<0) ans += MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- if(b1>b2 || b2>b3 || b3>b4) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a-a4+b-b4, a-a4)) % MOD;
- }
- ans += temp;
- while(ans>=MOD) ans -= MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- int a5 = obs[i5].ft; int b5 = obs[i5].sd;
- if(b1>b2 || b2>b3 || b3>b4 || b4>b5) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a5-a4+b5-b4, a5-a4)*C(a-a5+b-b5, a-a5)) % MOD;
- }
- ans -= temp;
- while(ans<0) ans += MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail) FOR(i6, i5+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- int a5 = obs[i5].ft; int b5 = obs[i5].sd;
- int a6 = obs[i6].ft; int b6 = obs[i6].sd;
- if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a5-a4+b5-b4, a5-a4)*C(a6-a5+b6-b5, b6-b5)*C(a-a6+b-b6, a-a6)) % MOD;
- }
- ans += temp;
- while(ans>=MOD) ans -= MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail) FOR(i6, i5+1, tail) FOR(i7, i6+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- int a5 = obs[i5].ft; int b5 = obs[i5].sd;
- int a6 = obs[i6].ft; int b6 = obs[i6].sd;
- int a7 = obs[i7].ft; int b7 = obs[i7].sd;
- if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a5-a4+b5-b4, a5-a4)*C(a6-a5+b6-b5, b6-b5)*C(a7-a6+b7-b6, a7-a6)*C(a-a7+b-b7, a-a7)) % MOD;
- }
- ans -= temp;
- while(ans<0) ans += MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail) FOR(i6, i5+1, tail) FOR(i7, i6+1, tail) FOR(i8, i7+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- int a5 = obs[i5].ft; int b5 = obs[i5].sd;
- int a6 = obs[i6].ft; int b6 = obs[i6].sd;
- int a7 = obs[i7].ft; int b7 = obs[i7].sd;
- int a8 = obs[i8].ft; int b8 = obs[i8].sd;
- if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a5-a4+b5-b4, a5-a4)*C(a6-a5+b6-b5, b6-b5)*C(a7-a6+b7-b6, a7-a6)*C(a8-a7+b8-b7, a8-a7)*C(a-a8+b-b8, a-a8)) % MOD;
- }
- ans += temp;
- while(ans>=MOD) ans -= MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail) FOR(i6, i5+1, tail) FOR(i7, i6+1, tail) FOR(i8, i7+1, tail) FOR(i9, i8+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- int a5 = obs[i5].ft; int b5 = obs[i5].sd;
- int a6 = obs[i6].ft; int b6 = obs[i6].sd;
- int a7 = obs[i7].ft; int b7 = obs[i7].sd;
- int a8 = obs[i8].ft; int b8 = obs[i8].sd;
- int a9 = obs[i9].ft; int b9 = obs[i9].sd;
- if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8 || b8>b9) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a5-a4+b5-b4, a5-a4)*C(a6-a5+b6-b5, b6-b5)*C(a7-a6+b7-b6, a7-a6)*C(a8-a7+b8-b7, a8-a7)*C(a9-a8+b9-b8, a9-a8)*C(a-a9+b-b9, a-a9)) % MOD;
- }
- ans -= temp;
- while(ans<0) ans += MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail) FOR(i6, i5+1, tail) FOR(i7, i6+1, tail) FOR(i8, i7+1, tail) FOR(i9, i8+1, tail) FOR(i10, i9+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- int a5 = obs[i5].ft; int b5 = obs[i5].sd;
- int a6 = obs[i6].ft; int b6 = obs[i6].sd;
- int a7 = obs[i7].ft; int b7 = obs[i7].sd;
- int a8 = obs[i8].ft; int b8 = obs[i8].sd;
- int a9 = obs[i9].ft; int b9 = obs[i9].sd;
- int a10 = obs[i10].ft; int b10 = obs[i10].sd;
- if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8 || b8>b9 || b9>b10) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a5-a4+b5-b4, a5-a4)*C(a6-a5+b6-b5, b6-b5)*C(a7-a6+b7-b6, a7-a6)*C(a8-a7+b8-b7, a8-a7)*C(a9-a8+b9-b8, a9-a8)*C(a10-a9+b10-b9, a10-a9)*C(a-a10+b-b10, a-a10)) % MOD;
- }
- ans += temp;
- while(ans>=MOD) ans -= MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail) FOR(i6, i5+1, tail) FOR(i7, i6+1, tail) FOR(i8, i7+1, tail) FOR(i9, i8+1, tail) FOR(i10, i9+1, tail) FOR(i11, i10+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- int a5 = obs[i5].ft; int b5 = obs[i5].sd;
- int a6 = obs[i6].ft; int b6 = obs[i6].sd;
- int a7 = obs[i7].ft; int b7 = obs[i7].sd;
- int a8 = obs[i8].ft; int b8 = obs[i8].sd;
- int a9 = obs[i9].ft; int b9 = obs[i9].sd;
- int a10 = obs[i10].ft; int b10 = obs[i10].sd;
- int a11 = obs[i11].ft; int b11 = obs[i11].sd;
- if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8 || b8>b9 || b9>b10 || b10>b11) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a5-a4+b5-b4, a5-a4)*C(a6-a5+b6-b5, b6-b5)*C(a7-a6+b7-b6, a7-a6)*C(a8-a7+b8-b7, a8-a7)*C(a9-a8+b9-b8, a9-a8)*C(a10-a9+b10-b9, a10-a9)*C(a11-a10+b11-b10, a11-a10)*C(a-a11+b-b11, a-a11)) % MOD;
- }
- ans -= temp;
- while(ans<0) ans += MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail) FOR(i6, i5+1, tail) FOR(i7, i6+1, tail) FOR(i8, i7+1, tail) FOR(i9, i8+1, tail) FOR(i10, i9+1, tail) FOR(i11, i10+1, tail) FOR(i12, i11+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- int a5 = obs[i5].ft; int b5 = obs[i5].sd;
- int a6 = obs[i6].ft; int b6 = obs[i6].sd;
- int a7 = obs[i7].ft; int b7 = obs[i7].sd;
- int a8 = obs[i8].ft; int b8 = obs[i8].sd;
- int a9 = obs[i9].ft; int b9 = obs[i9].sd;
- int a10 = obs[i10].ft; int b10 = obs[i10].sd;
- int a11 = obs[i11].ft; int b11 = obs[i11].sd;
- int a12 = obs[i12].ft; int b12 = obs[i12].sd;
- if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8 || b8>b9 || b9>b10 || b10>b11 || b11>b12) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a5-a4+b5-b4, a5-a4)*C(a6-a5+b6-b5, b6-b5)*C(a7-a6+b7-b6, a7-a6)*C(a8-a7+b8-b7, a8-a7)*C(a9-a8+b9-b8, a9-a8)*C(a10-a9+b10-b9, a10-a9)*C(a11-a10+b11-b10, a11-a10)*C(a12-a11+b12-b11, a12-a11)*C(a-a12+b-b12, a-a12)) % MOD;
- }
- ans += temp;
- while(ans>=MOD) ans -= MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail) FOR(i6, i5+1, tail) FOR(i7, i6+1, tail) FOR(i8, i7+1, tail) FOR(i9, i8+1, tail) FOR(i10, i9+1, tail) FOR(i11, i10+1, tail) FOR(i12, i11+1, tail) FOR(i13, i12+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- int a5 = obs[i5].ft; int b5 = obs[i5].sd;
- int a6 = obs[i6].ft; int b6 = obs[i6].sd;
- int a7 = obs[i7].ft; int b7 = obs[i7].sd;
- int a8 = obs[i8].ft; int b8 = obs[i8].sd;
- int a9 = obs[i9].ft; int b9 = obs[i9].sd;
- int a10 = obs[i10].ft; int b10 = obs[i10].sd;
- int a11 = obs[i11].ft; int b11 = obs[i11].sd;
- int a12 = obs[i12].ft; int b12 = obs[i12].sd;
- int a13 = obs[i13].ft; int b13 = obs[i13].sd;
- if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8 || b8>b9 || b9>b10 || b10>b11 || b11>b12 || b12>b13) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a5-a4+b5-b4, a5-a4)*C(a6-a5+b6-b5, b6-b5)*C(a7-a6+b7-b6, a7-a6)*C(a8-a7+b8-b7, a8-a7)*C(a9-a8+b9-b8, a9-a8)*C(a10-a9+b10-b9, a10-a9)*C(a11-a10+b11-b10, a11-a10)*C(a12-a11+b12-b11, a12-a11)*C(a13-a12+b12-b11, a13-a12)*C(a-a13+b-b13, a-a13)) % MOD;
- }
- ans -= temp;
- while(ans<0) ans += MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail) FOR(i6, i5+1, tail) FOR(i7, i6+1, tail) FOR(i8, i7+1, tail) FOR(i9, i8+1, tail) FOR(i10, i9+1, tail) FOR(i11, i10+1, tail) FOR(i12, i11+1, tail) FOR(i13, i12+1, tail) FOR(i14, i13+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- int a5 = obs[i5].ft; int b5 = obs[i5].sd;
- int a6 = obs[i6].ft; int b6 = obs[i6].sd;
- int a7 = obs[i7].ft; int b7 = obs[i7].sd;
- int a8 = obs[i8].ft; int b8 = obs[i8].sd;
- int a9 = obs[i9].ft; int b9 = obs[i9].sd;
- int a10 = obs[i10].ft; int b10 = obs[i10].sd;
- int a11 = obs[i11].ft; int b11 = obs[i11].sd;
- int a12 = obs[i12].ft; int b12 = obs[i12].sd;
- int a13 = obs[i13].ft; int b13 = obs[i13].sd;
- int a14 = obs[i14].ft; int b14 = obs[i14].sd;
- if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8 || b8>b9 || b9>b10 || b10>b11 || b11>b12 || b12>b13 || b13>b14) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a5-a4+b5-b4, a5-a4)*C(a6-a5+b6-b5, b6-b5)*C(a7-a6+b7-b6, a7-a6)*C(a8-a7+b8-b7, a8-a7)*C(a9-a8+b9-b8, a9-a8)*C(a10-a9+b10-b9, a10-a9)*C(a11-a10+b11-b10, a11-a10)*C(a12-a11+b12-b11, a12-a11)*C(a13-a12+b12-b11, a13-a12)*C(a14-a13+b14-b13, a14-a13)*C(a-a14+b-b14, a-a14)) % MOD;
- }
- ans += temp;
- while(ans>=MOD) ans -= MOD;
- temp = 0;
- FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail) FOR(i6, i5+1, tail) FOR(i7, i6+1, tail) FOR(i8, i7+1, tail) FOR(i9, i8+1, tail) FOR(i10, i9+1, tail) FOR(i11, i10+1, tail) FOR(i12, i11+1, tail) FOR(i13, i12+1, tail) FOR(i14, i13+1, tail) FOR(i15, i14+1, tail){
- int a1 = obs[i1].ft; int b1 = obs[i1].sd;
- int a2 = obs[i2].ft; int b2 = obs[i2].sd;
- int a3 = obs[i3].ft; int b3 = obs[i3].sd;
- int a4 = obs[i4].ft; int b4 = obs[i4].sd;
- int a5 = obs[i5].ft; int b5 = obs[i5].sd;
- int a6 = obs[i6].ft; int b6 = obs[i6].sd;
- int a7 = obs[i7].ft; int b7 = obs[i7].sd;
- int a8 = obs[i8].ft; int b8 = obs[i8].sd;
- int a9 = obs[i9].ft; int b9 = obs[i9].sd;
- int a10 = obs[i10].ft; int b10 = obs[i10].sd;
- int a11 = obs[i11].ft; int b11 = obs[i11].sd;
- int a12 = obs[i12].ft; int b12 = obs[i12].sd;
- int a13 = obs[i13].ft; int b13 = obs[i13].sd;
- int a14 = obs[i14].ft; int b14 = obs[i14].sd;
- int a15 = obs[i15].ft; int b15 = obs[i15].sd;
- if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8 || b8>b9 || b9>b10 || b10>b11 || b11>b12 || b12>b13 || b13>b14 || b14>b15) continue;
- temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a3-a2+b3-b2, a3-a2)*C(a4-a3+b4-b3, b4-b3)*C(a5-a4+b5-b4, a5-a4)*C(a6-a5+b6-b5, b6-b5)*C(a7-a6+b7-b6, a7-a6)*C(a8-a7+b8-b7, a8-a7)*C(a9-a8+b9-b8, a9-a8)*C(a10-a9+b10-b9, a10-a9)*C(a11-a10+b11-b10, a11-a10)*C(a12-a11+b12-b11, a12-a11)*C(a13-a12+b12-b11, a13-a12)*C(a14-a13+b14-b13, a14-a13)*C(a15-a14+b15-b14, a15-a14)*C(a-a15+b-b15, a-a15)) % MOD;
- }
- ans -= temp;
- while(ans<0) ans += MOD;
- Pl(ans); continue;
- }
- // now they are linearly dependent non zero vectors
- bool opp = true;
- if(ax!=0 && ax*bx>0) opp = false;
- if(ay!=0 && ay*by>0) opp = false;
- if(!opp){
- if(x*ay != y*ax){ printf("0\n"); continue; }
- int z = 0, p;
- if(ax!=0){ if(ax*x<0){ printf("0\n"); continue; } a = ax; b = bx; z = 0; p = x; }
- else if(ay!=0){ if(ay*y<0){ printf("0\n"); continue; } a = ay; b = by; z = 1; p = y; }
- // a, b, p
- FOR(i, 0, 502) occ[i] = false;
- FOR(i, 0, k-1){
- if(ax*blo[i][1]-ay*blo[i][0] == 0 && pappu(p, i, z)) occ[abs(blo[i][z])] = 1;
- }
- a = abs(a); b = abs(b); p = abs(p);
- dp[0] = 1;
- FOR(i, 1, 502){ if(occ[i]) dp[i] = 0; else dp[i] = -1; }
- ll ans = DP(p);
- Pl(ans); continue;
- }
- else{
- printf("-1\n"); continue;
- }
- }
- SP;
- return 0;
- }
Add Comment
Please, Sign In to add comment