結果
| 問題 |
No.1241 Eternal Tours
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-09-06 15:18:17 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 783 ms / 6,000 ms |
| コード長 | 3,817 bytes |
| コンパイル時間 | 2,224 ms |
| コンパイル使用メモリ | 80,796 KB |
| 実行使用メモリ | 79,972 KB |
| 最終ジャッジ日時 | 2024-11-29 11:08:49 |
| 合計ジャッジ時間 | 18,065 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
ソースコード
import static java.lang.Math.*;
import static java.math.BigInteger.*;
import static java.util.Arrays.*;
import static java.util.Collections.*;
import java.math.*;
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) { new Main().run(); }
Scanner in = new Scanner(System.in);
void _out(Object...os) { System.out.println(deepToString(os)); }
void _err(Object...os) { System.err.println(deepToString(os)); }
final long MO = 998244353;
final long G = 3;
void run() {
for (; in.hasNext(); ) {
int X = in.nextInt();
int Y = in.nextInt();
long T = in.nextLong();
int A = in.nextInt();
int B = in.nextInt();
int C = in.nextInt();
int D = in.nextInt();
int m = 1 << (X + 1);
int n = 1 << (Y + 1);
long[] gms = new long[m];
long[] gns = new long[n];
gms[0] = 1;
gns[0] = 1;
gms[1] = power(G, (MO - 1) / m);
gns[1] = power(G, (MO - 1) / n);
for (int i = 2; i < m; ++i) {
gms[i] = (gms[i - 1] * gms[1]) % MO;
}
for (int i = 2; i < n; ++i) {
gns[i] = (gns[i - 1] * gns[1]) % MO;
}
long[][] f = new long[m][n];
f[0][0] = f[1][0] = f[0][1] = f[m - 1][0] = f[0][n - 1] = 1;
for (int x = 0; x < m; ++x) {
fft(n, gns, f[x]);
}
for (int y = 0; y < n; ++y) {
long[] work = new long[m];
for (int x = 0; x < m; ++x) {
work[x] = f[x][y];
}
fft(m, gms, work);
for (int x = 0; x < m; ++x) {
f[x][y] = work[x];
}
}
long TT = 1 + (T - 1) % (MO - 1);
for (int x = 0; x < m; ++x) for (int y = 0; y < n; ++y) {
f[x][y] = power(f[x][y], TT);
}
for (int i = 1; i < m - i; ++i) {
long t = gms[i];
gms[i] = gms[m - i];
gms[m - i] = t;
}
for (int i = 1; i < n - i; ++i) {
long t = gns[i];
gns[i] = gns[n - i];
gns[n - i] = t;
}
for (int x = 0; x < m; ++x) {
fft(n, gns, f[x]);
}
for (int y = 0; y < n; ++y) {
long[] work = new long[m];
for (int x = 0; x < m; ++x) {
work[x] = f[x][y];
}
fft(m, gms, work);
for (int x = 0; x < m; ++x) {
f[x][y] = work[x];
}
}
long invMN = power((1L * m * n) % MO, MO - 2);
for (int x = 0; x < m; ++x) for (int y = 0; y < n; ++y) {
f[x][y] = (f[x][y] * invMN) % MO;
}
long ans = 0;
for (int s : new int[]{+1, -1}) for (int t : new int[]{+1, -1}) {
int dx = (s * C - A) & (m - 1);
int dy = (t * D - B) & (n - 1);
ans += s * t * f[dx][dy];
}
ans = (ans % MO + MO) % MO;
System.out.println(ans);
}
}
/*
long power(long a, long e) {
if (e == 0) {
return 1 % MO;
} else {
long b = power(a, e / 2);
b = (b * b) % MO;
if (e % 2 != 0) {
b = (b * a) % MO;
}
return b;
}
}
//*/
//*
long power(long a, long e) {
long b = 1 % MO;
for (; e > 0; e /= 2) {
if (e % 2 != 0) {
b = (b * a) % MO;
}
a = (a * a) % MO;
}
return b;
}
//*/
void fft(int n, long[] gs, long[] xs) {
for (int l = n, shift = 0; (l /= 2) >= 1; ++shift) {
for (int i = 0; i < l; ++i) {
for (int j = i; j < n; j += l * 2) {
long t = (xs[j] - xs[j + l]) % MO;
xs[j] = (xs[j] + xs[j + l]) % MO;
xs[j + l] = (gs[i << shift] * t) % MO;
}
}
}
for (int i = 0, j = 1; j < n; ++j) {
for (int k = n / 2; k > (i ^= k); k /= 2) {}
if (j < i) {
long t = xs[i];
xs[i] = xs[j];
xs[j] = t;
}
}
}
}