Submission #00346


ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.IO;
using System.Text;
using System.Diagnostics;
using Binary = System.Func<System.Linq.Expressions.ParameterExpression, System.Linq.Expressions.ParameterExpression, System.Linq.Expressions.BinaryExpression>;
using Unary = System.Func<System.Linq.Expressions.ParameterExpression, System.Linq.Expressions.UnaryExpression>;
class Program
{
static StreamWriter sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
static Scan sc = new Scan();
const int M = 1000000007;
const double eps = 1e-11;
static readonly int[] dd = { 0, 1, 0, -1, 0 };
static void Main()
{
int h, w, t;
sc.Multi(out h, out w, out t);
int preh = h, prew = w;
if (h % 2 == 1) ++h;
if (w % 2 == 1) ++w;
int l = w * h;
int n = sc.Int;
var beet = new bool[h][];
for (int i = 0; i < h; i++)
{
beet[i] = new bool[w];
}
for (int i = preh; i < h; i++)
{
for (int j = 0; j < w; j++)
{
beet[i][j] = true;
}
}
for (int i = 0; i < h; i++)
{
for (int j = prew; j < w; j++)
{
beet[i][j] = true;
}
}
for (int i = 0; i < n; i++)
{
var a = sc.IntArr.Select(x => x - 1).ToArray();
beet[a[0]][a[1]] = true;
}
var mat = new long[l][];
for (int i = 0; i < l; i++)
{
mat[i] = new long[l];
}
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
if (beet[i][j]) continue;
for (int k = 0; k < 4; k++)
{
int ti = i + dd[k], tj = j + dd[k + 1];
if (ti >= 0 && ti < h && tj >= 0 && tj < w && !beet[ti][tj])
{
mat[ti * w + tj][i * w + j] = 1;
}
}
}
}
mat = mymath.pow(mat, 2);
var matod = new long[l / 2][];
var matev = new long[l / 2][];
for (int i = 0; i < l / 2; i++)
{
matod[i] = new long[l / 2];
matev[i] = new long[l / 2];
}
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
for (int k = 0; k < h; k++)
{
for (int p = 0; p < w; p++)
{
if ((i + j) % 2 == 0 && (k + p) % 2 == 0)
{
matev[i * w / 2 + j / 2][k * w / 2 + p / 2] = mat[i * w + j][k * w + p];
}
if ((i + j) % 2 == 1 && (k + p) % 2 == 1)
{
matod[i * w / 2 + j / 2][k * w / 2 + p / 2] = mat[i * w + j][k * w + p];
}
}
}
}
}
matev = mymath.pow(matev, t / 2);
matod = mymath.pow(matod, t / 2);
int q = sc.Int;
for (int i = 0; i < q; i++)
{
var a = sc.IntArr.Select(x => x - 1).ToArray();
if ((a[0] + a[1]) % 2 != (a[2] + a[3]) % 2)
{
Prt(0);
continue;
}
if ((a[0] + a[1]) % 2 == 0)
Prt(matev[a[0] * w / 2 + a[1] / 2][a[2] * w / 2 + a[3] / 2]);
else
Prt(matod[a[0] * w / 2 + a[1] / 2][a[2] * w / 2 + a[3] / 2]);
}
sw.Flush();
}
static void swap<T>(ref T a, ref T b) { var t = a; a = b; b = t; }
static T Max<T>(params T[] a) { return a.Max(); }
static T Min<T>(params T[] a) { return a.Min(); }
static void DBG(string a) { Console.WriteLine(a); }
static void DBG<T>(IEnumerable<T> a) { Console.WriteLine(string.Join(" ", a)); }
static void DBG(params object[] a) { Console.WriteLine(string.Join(" ", a)); }
static void Prt(string a) { sw.WriteLine(a); }
static void Prt<T>(IEnumerable<T> a) { sw.WriteLine(string.Join(" ", a)); }
static void Prt(params object[] a) { sw.WriteLine(string.Join(" ", a)); }
}
static class ex
{
public static void swap<T>(this IList<T> a, int i, int j) { var t = a[i]; a[i] = a[j]; a[j] = t; }
public static T[] copy<T>(this IList<T> a)
{
var ret = new T[a.Count];
for (int i = 0; i < a.Count; i++) ret[i] = a[i];
return ret;
}
}
static class Operator<T>
{
static readonly ParameterExpression x = Expression.Parameter(typeof(T), "x");
static readonly ParameterExpression y = Expression.Parameter(typeof(T), "y");
public static readonly Func<T, T, T> Add = Lambda(Expression.Add);
public static readonly Func<T, T, T> Subtract = Lambda(Expression.Subtract);
public static readonly Func<T, T, T> Multiply = Lambda(Expression.Multiply);
public static readonly Func<T, T, T> Divide = Lambda(Expression.Divide);
public static readonly Func<T, T> Plus = Lambda(Expression.UnaryPlus);
public static readonly Func<T, T> Negate = Lambda(Expression.Negate);
public static Func<T, T, T> Lambda(Binary op) { return Expression.Lambda<Func<T, T, T>>(op(x, y), x, y).Compile(); }
public static Func<T, T> Lambda(Unary op) { return Expression.Lambda<Func<T, T>>(op(x), x).Compile(); }
}
class Scan
{
public int Int { get { return int.Parse(Str); } }
public long Long { get { return long.Parse(Str); } }
public double Double { get { return double.Parse(Str); } }
public string Str { get { return Console.ReadLine().Trim(); } }
public int[] IntArr { get { return StrArr.Select(int.Parse).ToArray(); } }
public long[] LongArr { get { return StrArr.Select(long.Parse).ToArray(); } }
public double[] DoubleArr { get { return StrArr.Select(double.Parse).ToArray(); } }
public string[] StrArr { get { return Str.Split(); } }
bool eq<T, U>() { return typeof(T).Equals(typeof(U)); }
T ct<T, U>(U a) { return (T)Convert.ChangeType(a, typeof(T)); }
T cv<T>(string s) { return eq<T, int>() ? ct<T, int>(int.Parse(s))
: eq<T, long>() ? ct<T, long>(long.Parse(s))
: eq<T, double>() ? ct<T, double>(double.Parse(s))
: eq<T, char>() ? ct<T, char>(s[0])
: ct<T, string>(s); }
public void Multi<T>(out T a) { a = cv<T>(Str); }
public void Multi<T, U>(out T a, out U b)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); }
public void Multi<T, U, V>(out T a, out U b, out V c)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); }
public void Multi<T, U, V, W>(out T a, out U b, out V c, out W d)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); d = cv<W>(ar[3]); }
public void Multi<T, U, V, W, X>(out T a, out U b, out V c, out W d, out X e)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); d = cv<W>(ar[3]); e = cv<X>(ar[4]); }
public void Multi<T, U, V, W, X, Y>(out T a, out U b, out V c, out W d, out X e, out Y f)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); d = cv<W>(ar[3]); e = cv<X>(ar[4]); f = cv<Y>(ar[5]); }
public void Multi<T, U, V, W, X, Y, Z>(out T a, out U b, out V c, out W d, out X e, out Y f, out Z g)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); d = cv<W>(ar[3]); e = cv<X>(ar[4]); f = cv<Y>(ar[5]); g = cv<Z>(ar[6]);}
}
class mymath
{
public static long Mod = 1000000007;
public static bool isprime(long a)
{
if (a < 2) return false;
for (long i = 2; i * i <= a; i++) if (a % i == 0) return false;
return true;
}
public static bool[] sieve(int n)
{
var p = new bool[n + 1];
for (int i = 2; i <= n; i++) p[i] = true;
for (int i = 2; i * i <= n; i++) if (p[i]) for (int j = i * i; j <= n; j += i) p[j] = false;
return p;
}
public static List<int> getprimes(int n)
{
var prs = new List<int>();
var p = sieve(n);
for (int i = 2; i <= n; i++) if (p[i]) prs.Add(i);
return prs;
}
public static long[][] E(int n)
{
var ret = new long[n][];
for (int i = 0; i < n; i++) { ret[i] = new long[n]; ret[i][i] = 1; }
return ret;
}
public static long[][] pow(long[][] A, long n)
{
if (n == 0) return E(A.Length);
var t = pow(A, n / 2);
if ((n & 1) == 0) return mul(t, t);
return mul(mul(t, t), A);
}
public static double dot(double[] x, double[] y)
{
int n = x.Length;
double ret = 0;
for (int i = 0; i < n; i++) ret += x[i] * y[i];
return ret;
}
public static long dot(long[] x, long[] y)
{
int n = x.Length;
long ret = 0;
for (int i = 0; i < n; i++) ret = (ret + x[i] * y[i]) % Mod;
return ret;
}
public static T[][] trans<T>(T[][] A)
{
int n = A[0].Length, m = A.Length;
var ret = new T[n][];
for (int i = 0; i < n; i++) { ret[i] = new T[m]; for (int j = 0; j < m; j++) ret[i][j] = A[j][i]; }
return ret;
}
public static double[] mul(double[][] A, double[] x)
{
int n = A.Length;
var ret = new double[n];
for (int i = 0; i < n; i++) ret[i] = dot(x, A[i]);
return ret;
}
public static long[] mul(long[][] A, long[] x)
{
int n = A.Length;
var ret = new long[n];
for (int i = 0; i < n; i++) ret[i] = dot(x, A[i]);
return ret;
}
public static long[][] mul(long[][] A, long[][] B)
{
int n = A.Length;
var Bt = trans(B);
var ret = new long[n][];
for (int i = 0; i < n; i++) ret[i] = mul(Bt, A[i]);
return ret;
}
public static long[] add(long[] x, long[] y)
{
int n = x.Length;
var ret = new long[n];
for (int i = 0; i < n; i++) ret[i] = (x[i] + y[i]) % Mod;
return ret;
}
public static long[][] add(long[][] A, long[][] B)
{
int n = A.Length;
var ret = new long[n][];
for (int i = 0; i < n; i++) ret[i] = add(A[i], B[i]);
return ret;
}
public static long pow(long a, long b)
{
if (a >= Mod) return pow(a % Mod, b);
if (a == 0) return 0;
if (b == 0) return 1;
var t = pow(a, b / 2);
if ((b & 1) == 0) return t * t % Mod;
return t * t % Mod * a % Mod;
}
public static long inv(long a) { return pow(a, Mod - 2); }
public static long gcd(long a, long b)
{
while (b > 0) { var t = a % b; a = b; b = t; }
return a;
}
// a x + b y = gcd(a, b)
public static long extgcd(long a, long b, out long x, out long y)
{
long g = a; x = 1; y = 0;
if (b > 0) { g = extgcd(b, a % b, out y, out x); y -= a / b * x; }
return g;
}
public static long lcm(long a, long b) { return a / gcd(a, b) * b; }
public static long comb(int n, int r)
{
if (n < 0 || r < 0 || r > n) return 0;
if (n - r < r) r = n - r;
if (r == 0) return 1;
if (r == 1) return n;
int[] numer = new int[r], denom = new int[r];
for (int k = 0; k < r; k++) { numer[k] = n - r + k + 1; denom[k] = k + 1; }
for (int p = 2; p <= r; p++)
{
int piv = denom[p - 1];
if (piv > 1)
{
int ofst = (n - r) % p;
for (int k = p - 1; k < r; k += p) { numer[k - ofst] /= piv; denom[k] /= piv; }
}
}
long ret = 1;
for (int k = 0; k < r; k++) if (numer[k] > 1) ret = ret * numer[k] % Mod;
return ret;
}
}

ステータス

項目 データ
問題 0005 - devilswalk
ユーザー名 rian
投稿日時 2017-07-07 22:55:43
言語 C#
状態 Accepted
得点 100
ソースコード長 12316 Byte
最大実行時間 1975 ms
最大メモリ使用量 21012 KB

セット

セット 得点 Cases
1 ALL 100 / 100 *

テストケース

ファイル名 状態 実行時間 メモリ使用量 #
00_sample_01.in AC 51 ms 9428 KB
1
02_random_01.in AC 52 ms 11468 KB
1
02_random_02.in AC 44 ms 11548 KB
1
02_random_03.in AC 57 ms 13596 KB
1
02_random_04.in AC 68 ms 13580 KB
1
02_random_05.in AC 54 ms 15768 KB
1
02_random_06.in AC 63 ms 13904 KB
1
02_random_07.in AC 195 ms 16048 KB
1
02_random_08.in AC 53 ms 11900 KB
1
02_random_09.in AC 56 ms 13804 KB
1
02_random_10.in AC 81 ms 13912 KB
1
02_random_11.in AC 74 ms 13976 KB
1
02_random_12.in AC 51 ms 11992 KB
1
02_random_13.in AC 44 ms 11852 KB
1
02_random_14.in AC 47 ms 11832 KB
1
02_random_15.in AC 72 ms 13860 KB
1
02_random_16.in AC 56 ms 16016 KB
1
02_random_17.in AC 48 ms 11872 KB
1
02_random_18.in AC 79 ms 11976 KB
1
02_random_19.in AC 61 ms 7864 KB
1
02_random_20.in AC 204 ms 14244 KB
1
02_random_21.in AC 135 ms 16376 KB
1
02_random_22.in AC 117 ms 12012 KB
1
02_random_23.in AC 46 ms 14056 KB
1
02_random_24.in AC 45 ms 12132 KB
1
02_random_25.in AC 59 ms 14140 KB
1
02_random_26.in AC 52 ms 14228 KB
1
02_random_27.in AC 186 ms 16384 KB
1
02_random_28.in AC 46 ms 12224 KB
1
02_random_29.in AC 66 ms 16412 KB
1
02_random_30.in AC 47 ms 12228 KB
1
03_large_01.in AC 1305 ms 18992 KB
1
03_large_02.in AC 1243 ms 16604 KB
1
03_large_03.in AC 1975 ms 18744 KB
1
03_large_04.in AC 1933 ms 20832 KB
1
03_large_05.in AC 1352 ms 16708 KB
1
03_large_06.in AC 1329 ms 18840 KB
1
03_large_07.in AC 1876 ms 18980 KB
1
03_large_08.in AC 1266 ms 16476 KB
1
03_large_09.in AC 1817 ms 21012 KB
1
03_large_10.in AC 1878 ms 18996 KB
1