Guest User

Untitled

a guest
Nov 16th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.93 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<set>
  6. #include<map>
  7. #include<functional>
  8. #include<string>
  9. #include<cstring>
  10. #include<cstdlib>
  11. #include<queue>
  12. #include<utility>
  13. #include<fstream>
  14. #include<sstream>
  15. #include<cmath>
  16. #include<stack>
  17. #include<cstdio>
  18. #include <ctime>
  19. #include<cassert>
  20.  
  21. using namespace std;
  22.  
  23. #define MEM(a,b) memset(a,(b),sizeof(a))
  24. #define FOR(i, a, b) for(i=(a);i<=(b);i++)
  25. #define FORR(i, a, b) for(i=(a);i>=(b);i--)
  26. #define S(n) scanf("%d", &n)
  27. #define P(k) printf("%d\n", k)
  28. #define Pl(k) printf("%lld\n", k)
  29. #define pb push_back
  30. #define mp make_pair
  31. #define ll long long
  32. #define VI vector<int>
  33. #define PII pair<int, int>
  34. #define ft first
  35. #define sd second
  36. #define inf (1<<30)
  37. #define PNL primntf("\n")
  38. #define SP system("pause")
  39. #define MOD 1000000007
  40. #define PII pair<int, int>
  41. #define HAHA printf("HAHA\n")
  42.  
  43. int blo[17][2];
  44. pair<int, int> obs[17];
  45. int ax, ay, bx, by, x, y, k, tail, a, b;
  46. ll c[2000][2000];
  47. bool occ[505];
  48. ll dp[505];
  49.  
  50. ll C(int n, int m){
  51. assert(n<=2000 && m<=2000);
  52. if(c[n][m]!=-1) return c[n][m];
  53. c[n][m] = ( C(n-1, m) + C(n-1, m-1) ) % MOD;
  54. return c[n][m];
  55. }
  56.  
  57. ll DP(int n){
  58. if(n<0) return 0;
  59. assert(n<505);
  60. if(dp[n]!= -1) return dp[n];
  61. dp[n] = (DP(n-a) + DP(n-b)) % MOD;
  62. return dp[n];
  63. }
  64.  
  65. bool pappu(int p, int i, int z){
  66. if(p==0){
  67. assert(0<=i && i<17 && (z==1 || z==2));
  68. if(blo[i][z] == 0) return 1;
  69. else return 0;
  70. }
  71. else if(p>0){
  72. assert(0<=i && i<17 && (z==1 || z==2));
  73. if(blo[i][z]>=0 && blo[i][z]<=p) return 1;
  74. else return 0;
  75. }
  76. else{
  77. assert(0<=i && i<17 && (z==1 || z==2));
  78. if(blo[i][z]<=0 && blo[i][z]>=p) return 1;
  79. else return 0;
  80. }
  81. }
  82.  
  83. int triv(int cx, int cy){
  84. int m;
  85. int i;
  86. if(cx==0){
  87. if(x!=0) return 0;
  88. if(y%(abs(cy))!=0) return 0;
  89. if(y/cy < 0) return 0;
  90. m = y / cy;
  91. FOR(i, 0, k-1){
  92. if(blo[i][0]==0 && blo[i][1]%(abs(cy))==0 && blo[i][1]/cy <= m) return 0;
  93. }
  94. return 1;
  95. }
  96. else if(cy==0){
  97. if(y!=0) return 0;
  98. if(x%(abs(cx))!=0) return 0;
  99. if(x/cx < 0) return 0;
  100. m = x / cx;
  101. FOR(i, 0, k-1){
  102. if(blo[i][1]==0 && blo[i][0]%(abs(cx))==0 && blo[i][0]/cx <= m) return 0;
  103. }
  104. return 1;
  105. }
  106. else{
  107. if(x%(abs(cx))!=0) return 0;
  108. if(y%(abs(cy))!=0) return 0;
  109. if(x/cx < 0) return 0;
  110. if(y/cy < 0) return 0;
  111. m = x / cx;
  112. int n = y / cy;
  113. FOR(i, 0, k-1){
  114. if(blo[i][0]%(abs(cx))==0 && blo[i][1]%(abs(cy))==0 && blo[i][0]/cx <= m && blo[i][1]/cy <= n) return 0;
  115. }
  116. return 1;
  117. }
  118. return 0;
  119. }
  120.  
  121. int main(){
  122. int i, j, l, n, m, t;
  123.  
  124. FOR(i, 0, 1999) FOR(j, 0, 1999) c[i][j] = -1;
  125. c[0][0] = 1;
  126. FOR(j, 1, 1999) c[0][j] = 0;
  127. FOR(i, 1, 1999) c[i][0] = 1;
  128.  
  129. S(t);
  130. while(t--){
  131. S(x); S(y); S(k);
  132. S(ax); S(ay); S(bx); S(by);
  133. FOR(i, 0, k-1) scanf("%d %d", &blo[i][0], &blo[i][1]);
  134.  
  135. if(ax == 0 && ay == 0 && bx == 0 && by==0){ printf("0\n"); continue; }
  136. if(ax == 0 && ay == 0){ printf("%d\n", triv(bx, by)); continue; }
  137. if(bx == 0 && by == 0){ printf("%d\n", triv(ax, ay)); continue; }
  138.  
  139. if(ax*by != ay*bx){
  140.  
  141. //HAHA;
  142.  
  143. if((x*by-y*bx)%(abs(ax*by-ay*bx)) != 0){ printf("0\n"); continue; }
  144. if((ax*y-ay*x)%(abs(ax*by-ay*bx)) != 0){ printf("0\n"); continue; }
  145. if((x*by-y*bx)/(ax*by-ay*bx) < 0){ printf("0\n"); continue; }
  146. if((ax*y-ay*x)/(ax*by-ay*bx) < 0){ printf("0\n"); continue; }
  147. a = (x*by-y*bx)/(ax*by-ay*bx);
  148. b = (ax*y-ay*x)/(ax*by-ay*bx);
  149. tail = 0;
  150. FOR(i, 0, k-1){
  151. if((blo[i][0]*by-blo[i][1]*bx)%(abs(ax*by-ay*bx)) == 0 &&
  152. (ax*blo[i][1]-ay*blo[i][0])%(abs(ax*by-ay*bx)) == 0 &&
  153. (blo[i][0]*by-blo[i][1]*bx)/(ax*by-ay*bx) >= 0 &&
  154. (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); }
  155. }
  156.  
  157. sort(obs, obs + tail);
  158. tail--;
  159. int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15;
  160.  
  161. ll ans = 0;
  162. //P(a); P(b);
  163. ans += C(a+b, b);
  164.  
  165. //Pl(ans);
  166.  
  167. ll temp = 0;
  168. FOR(i, 0, tail){
  169. int c = obs[i].ft;
  170. int d = obs[i].sd;
  171. //P(c); P(d);
  172. temp = (temp + C(c+d, d)*C(a-c+b-d, a-c)) % MOD;
  173. }
  174. ans -= temp;
  175. while(ans<0) ans += MOD;
  176.  
  177. temp = 0;
  178. FOR(i, 0, tail) FOR(j, i+1, tail){
  179. int a1 = obs[i].ft; int b1 = obs[i].sd;
  180. int a2 = obs[j].ft; int b2 = obs[j].sd;
  181. if(b1>b2) continue;
  182. temp = (temp + C(a1+b1, a1)*C(a2-a1+b2-b1, a2-a1)*C(a-a2+b-b2, a-a2)) % MOD;
  183. }
  184. ans = (ans + temp) % MOD;
  185.  
  186. temp = 0;
  187. FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail){
  188. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  189. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  190. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  191. if(b1>b2 || b2>b3) continue;
  192. 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;
  193. }
  194. ans -= temp;
  195. while(ans<0) ans += MOD;
  196.  
  197. temp = 0;
  198. FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail){
  199. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  200. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  201. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  202. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  203. if(b1>b2 || b2>b3 || b3>b4) continue;
  204. 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;
  205. }
  206. ans += temp;
  207. while(ans>=MOD) ans -= MOD;
  208.  
  209. temp = 0;
  210. FOR(i1, 0, tail) FOR(i2, i1+1, tail) FOR(i3, i2 + 1, tail) FOR(i4, i3+1, tail) FOR(i5, i4+1, tail){
  211. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  212. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  213. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  214. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  215. int a5 = obs[i5].ft; int b5 = obs[i5].sd;
  216. if(b1>b2 || b2>b3 || b3>b4 || b4>b5) continue;
  217. 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;
  218. }
  219. ans -= temp;
  220. while(ans<0) ans += MOD;
  221.  
  222. temp = 0;
  223. 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){
  224. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  225. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  226. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  227. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  228. int a5 = obs[i5].ft; int b5 = obs[i5].sd;
  229. int a6 = obs[i6].ft; int b6 = obs[i6].sd;
  230. if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6) continue;
  231. 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;
  232. }
  233. ans += temp;
  234. while(ans>=MOD) ans -= MOD;
  235.  
  236. temp = 0;
  237. 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){
  238. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  239. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  240. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  241. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  242. int a5 = obs[i5].ft; int b5 = obs[i5].sd;
  243. int a6 = obs[i6].ft; int b6 = obs[i6].sd;
  244. int a7 = obs[i7].ft; int b7 = obs[i7].sd;
  245. if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7) continue;
  246. 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;
  247. }
  248. ans -= temp;
  249. while(ans<0) ans += MOD;
  250.  
  251. temp = 0;
  252. 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){
  253. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  254. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  255. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  256. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  257. int a5 = obs[i5].ft; int b5 = obs[i5].sd;
  258. int a6 = obs[i6].ft; int b6 = obs[i6].sd;
  259. int a7 = obs[i7].ft; int b7 = obs[i7].sd;
  260. int a8 = obs[i8].ft; int b8 = obs[i8].sd;
  261. if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8) continue;
  262. 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;
  263. }
  264. ans += temp;
  265. while(ans>=MOD) ans -= MOD;
  266.  
  267. temp = 0;
  268. 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){
  269. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  270. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  271. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  272. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  273. int a5 = obs[i5].ft; int b5 = obs[i5].sd;
  274. int a6 = obs[i6].ft; int b6 = obs[i6].sd;
  275. int a7 = obs[i7].ft; int b7 = obs[i7].sd;
  276. int a8 = obs[i8].ft; int b8 = obs[i8].sd;
  277. int a9 = obs[i9].ft; int b9 = obs[i9].sd;
  278. if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8 || b8>b9) continue;
  279. 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;
  280. }
  281. ans -= temp;
  282. while(ans<0) ans += MOD;
  283.  
  284. temp = 0;
  285. 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){
  286. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  287. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  288. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  289. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  290. int a5 = obs[i5].ft; int b5 = obs[i5].sd;
  291. int a6 = obs[i6].ft; int b6 = obs[i6].sd;
  292. int a7 = obs[i7].ft; int b7 = obs[i7].sd;
  293. int a8 = obs[i8].ft; int b8 = obs[i8].sd;
  294. int a9 = obs[i9].ft; int b9 = obs[i9].sd;
  295. int a10 = obs[i10].ft; int b10 = obs[i10].sd;
  296. if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8 || b8>b9 || b9>b10) continue;
  297. 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;
  298. }
  299. ans += temp;
  300. while(ans>=MOD) ans -= MOD;
  301.  
  302. temp = 0;
  303. 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){
  304. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  305. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  306. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  307. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  308. int a5 = obs[i5].ft; int b5 = obs[i5].sd;
  309. int a6 = obs[i6].ft; int b6 = obs[i6].sd;
  310. int a7 = obs[i7].ft; int b7 = obs[i7].sd;
  311. int a8 = obs[i8].ft; int b8 = obs[i8].sd;
  312. int a9 = obs[i9].ft; int b9 = obs[i9].sd;
  313. int a10 = obs[i10].ft; int b10 = obs[i10].sd;
  314. int a11 = obs[i11].ft; int b11 = obs[i11].sd;
  315. if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8 || b8>b9 || b9>b10 || b10>b11) continue;
  316. 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;
  317. }
  318. ans -= temp;
  319. while(ans<0) ans += MOD;
  320.  
  321. temp = 0;
  322. 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){
  323. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  324. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  325. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  326. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  327. int a5 = obs[i5].ft; int b5 = obs[i5].sd;
  328. int a6 = obs[i6].ft; int b6 = obs[i6].sd;
  329. int a7 = obs[i7].ft; int b7 = obs[i7].sd;
  330. int a8 = obs[i8].ft; int b8 = obs[i8].sd;
  331. int a9 = obs[i9].ft; int b9 = obs[i9].sd;
  332. int a10 = obs[i10].ft; int b10 = obs[i10].sd;
  333. int a11 = obs[i11].ft; int b11 = obs[i11].sd;
  334. int a12 = obs[i12].ft; int b12 = obs[i12].sd;
  335. if(b1>b2 || b2>b3 || b3>b4 || b4>b5 || b5>b6 || b6>b7 || b7>b8 || b8>b9 || b9>b10 || b10>b11 || b11>b12) continue;
  336. 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;
  337. }
  338. ans += temp;
  339. while(ans>=MOD) ans -= MOD;
  340.  
  341. temp = 0;
  342. 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){
  343. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  344. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  345. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  346. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  347. int a5 = obs[i5].ft; int b5 = obs[i5].sd;
  348. int a6 = obs[i6].ft; int b6 = obs[i6].sd;
  349. int a7 = obs[i7].ft; int b7 = obs[i7].sd;
  350. int a8 = obs[i8].ft; int b8 = obs[i8].sd;
  351. int a9 = obs[i9].ft; int b9 = obs[i9].sd;
  352. int a10 = obs[i10].ft; int b10 = obs[i10].sd;
  353. int a11 = obs[i11].ft; int b11 = obs[i11].sd;
  354. int a12 = obs[i12].ft; int b12 = obs[i12].sd;
  355. int a13 = obs[i13].ft; int b13 = obs[i13].sd;
  356. 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;
  357. 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;
  358. }
  359. ans -= temp;
  360. while(ans<0) ans += MOD;
  361.  
  362. temp = 0;
  363. 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){
  364. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  365. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  366. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  367. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  368. int a5 = obs[i5].ft; int b5 = obs[i5].sd;
  369. int a6 = obs[i6].ft; int b6 = obs[i6].sd;
  370. int a7 = obs[i7].ft; int b7 = obs[i7].sd;
  371. int a8 = obs[i8].ft; int b8 = obs[i8].sd;
  372. int a9 = obs[i9].ft; int b9 = obs[i9].sd;
  373. int a10 = obs[i10].ft; int b10 = obs[i10].sd;
  374. int a11 = obs[i11].ft; int b11 = obs[i11].sd;
  375. int a12 = obs[i12].ft; int b12 = obs[i12].sd;
  376. int a13 = obs[i13].ft; int b13 = obs[i13].sd;
  377. int a14 = obs[i14].ft; int b14 = obs[i14].sd;
  378. 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;
  379. 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;
  380. }
  381. ans += temp;
  382. while(ans>=MOD) ans -= MOD;
  383.  
  384. temp = 0;
  385. 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){
  386. int a1 = obs[i1].ft; int b1 = obs[i1].sd;
  387. int a2 = obs[i2].ft; int b2 = obs[i2].sd;
  388. int a3 = obs[i3].ft; int b3 = obs[i3].sd;
  389. int a4 = obs[i4].ft; int b4 = obs[i4].sd;
  390. int a5 = obs[i5].ft; int b5 = obs[i5].sd;
  391. int a6 = obs[i6].ft; int b6 = obs[i6].sd;
  392. int a7 = obs[i7].ft; int b7 = obs[i7].sd;
  393. int a8 = obs[i8].ft; int b8 = obs[i8].sd;
  394. int a9 = obs[i9].ft; int b9 = obs[i9].sd;
  395. int a10 = obs[i10].ft; int b10 = obs[i10].sd;
  396. int a11 = obs[i11].ft; int b11 = obs[i11].sd;
  397. int a12 = obs[i12].ft; int b12 = obs[i12].sd;
  398. int a13 = obs[i13].ft; int b13 = obs[i13].sd;
  399. int a14 = obs[i14].ft; int b14 = obs[i14].sd;
  400. int a15 = obs[i15].ft; int b15 = obs[i15].sd;
  401. 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;
  402. 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;
  403. }
  404. ans -= temp;
  405. while(ans<0) ans += MOD;
  406.  
  407. Pl(ans); continue;
  408.  
  409. }
  410.  
  411. // now they are linearly dependent non zero vectors
  412. bool opp = true;
  413. if(ax!=0 && ax*bx>0) opp = false;
  414. if(ay!=0 && ay*by>0) opp = false;
  415.  
  416. if(!opp){
  417. if(x*ay != y*ax){ printf("0\n"); continue; }
  418.  
  419. int z = 0, p;
  420. if(ax!=0){ if(ax*x<0 || x%(abs(ax)) != 0){ printf("0\n"); continue; } a = ax; b = bx; z = 0; p = x; }
  421. else if(ay!=0){ if(ay*y<0 || y%(abs(ay)) != 0){ printf("0\n"); continue; } a = ay; b = by; z = 1; p = y; }
  422.  
  423. // a, b, p
  424.  
  425. FOR(i, 0, 502) occ[i] = false;
  426. FOR(i, 0, k-1){
  427. bool ok = true;
  428. if(ax!=0 && blo[i][0]%(abs(ax))!=0) ok = false;
  429. else if(ay!=0 && blo[i][1]%(abs(ay))!=0) ok = false;
  430. if(ax*blo[i][1]-ay*blo[i][0] == 0 && pappu(p, i, z) && ok) occ[abs(blo[i][z])] = 1;
  431. }
  432.  
  433. a = abs(a); b = abs(b); p = abs(p);
  434. dp[0] = 1;
  435. FOR(i, 1, 502){ if(occ[i]) dp[i] = 0; else dp[i] = -1; }
  436. ll ans = DP(p);
  437. Pl(ans); continue;
  438.  
  439. }
  440.  
  441. }
  442. SP;
  443. return 0;
  444. }
Add Comment
Please, Sign In to add comment