Guest User

Untitled

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