#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 200
#define MODULO 98999
static int s[N + 1][N + 1], S[N + 1][N + 1];
int sitrling_main() {
freopen("stirling.in", "r", stdin);
freopen("stirling.out", "w", stdout);
memset(s, 0, sizeof(s));
memset(S, 0, sizeof(S));
s[1][1] = 1;
S[1][1] = 1;
int i, j;
for (i = 2; i <= N; i++) {
for (j = 1; j <= i; j++) {
s[i][j] = (s[i - 1][j - 1] - (i - 1) * s[i - 1][j]) % MODULO;
S[i][j] = (S[i - 1][j - 1] + j * S[i - 1][j]) % MODULO;
}
}
int T;
scanf("%d\n", &T);
for (i = 0; i < T; i++) {
int x, n, m;
scanf("%d %d %d\n", &x, &n, &m);
if (x == 1) {
printf("%d\n", s[n][m]);
} else if (x == 2) {
printf("%d\n", S[n][m]);
}
}
return 0;
}
typedef struct uf_node_ {
int rank;
struct uf_node_ *parent;
} uf_node;
uf_node *new_node() {
uf_node *node = (uf_node *) malloc(sizeof(uf_node));
node->rank = 0;
node->parent = node;
return node;
}
uf_node *data[100001];
void do_union(int x, int y) {
uf_node *nx = data[x];
while (nx != nx->parent)
nx = nx->parent;
uf_node *ny = data[y];
while (ny != ny->parent)
ny = ny->parent;
if (nx->rank < ny->rank) {
nx->parent = ny;
ny->rank++;
} else {
ny->parent = nx;
nx->rank++;
}
}
int do_find(int x, int y) {
uf_node *nx = data[x];
while (nx != nx->parent)
nx = nx->parent;
uf_node *ny = data[y];
while (ny != ny->parent)
ny = ny->parent;
return nx == ny;
}
int union_find_main() {
freopen("disjoint.in", "r", stdin);
freopen("disjoint.out", "w", stdout);
int n, m, i;
int cod, x, y;
scanf("%d %d\n", &n, &m);
for (i = 1; i <= n; i++) {
data[i] = new_node();
}
for (i = 1; i <= m; i++) {
scanf("%d %d %d\n", &cod, &x, &y);
if (cod == 1) {
do_union(x, y);
} else if (cod == 2) {
int result = do_find(x, y);
if (result)
printf("DA\n");
else
printf("NU\n");
}
}
return 0;
}
static char str[100001], *it;
static int termen();
static int factor();
static int eval() {
int result = termen();
while (*it == '+' || *it == '-') {
if (*it == '+') {
it++;
result += termen();
} else if (*it == '-') {
it++;
result -= termen();
}
}
return result;
}
int termen() {
int result = factor();
while (*it == '*' || *it == '/') {
if (*it == '*') {
it++;
result *= factor();
} else if (*it == '/') {
it++;
result /= factor();
}
}
return result;
}
int factor() {
int result;
if (*it == '(') {
it++;
result = eval();
it++;
} else {
result = 0;
while (*it >= '0' && *it <= '9') {
result = result * 10 + *it - '0';
it++;
}
}
return result;
}
int evaluare_main() {
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
fgets(str, 100001, stdin);
int len = strlen(str);
if (str[len - 1] == '\n') {
str[len - 1] = 0;
len--;
}
it = str;
int result = eval();
printf("%d\n", result);
return 0;
}
void doprint(int i, long *pre, long *data) {
if (i == -1)
return;
doprint(pre[i], pre, data);
printf("%ld ", data[i]);
}
void print(int i, long *pre, long *data) {
if (i == 0)
return;
print(pre[i], pre, data);
printf("%d ", data[i]);
}
int scmax_main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
static long data[100010];
static long M[100010];
static long pre[100010];
int nr;
scanf("%d\n", &nr);
int i, j;
for (i = 1; i <= nr; i++) {
scanf("%ld ", &data[i]);
}
int L = 0, inf, sup, mid;
memset(M, 0, sizeof(M));
for (i = 1; i <= nr; i++) {
inf = 1;
sup = L;
j = 0;
if (data[M[L]] < data[i]) {
j = L;
}
else {
while (inf <= sup) {
mid = inf + (sup - inf) / 2;
if (data[M[mid]] < data[i]) {
if (data[M[mid + 1]] > data[i]) {
j = mid;
break;
}
inf = mid + 1;
}
else {
sup = mid - 1;
}
}
}
pre[i] = M[j];
if (j == L || data[i] < data[M[j + 1]]) {
M[j + 1] = i;
if (L < (j + 1)) {
L = j + 1;
}
}
}
printf("%d\n", L);
print(M[L], pre, data);
//for (i = 1; i <= nr; i++) {
// printf("%d %ld %d\n", i, data[i], pre[i]);
//}
/*
static long S[100000]
int bestS, bestJ;
S[0] = 1;
pre[0] = -1;
for (i = 1; i < nr; i++) {
bestS = 0;
bestJ = -1;
for (j = 0; j < i; j++) {
if (data[j] < data[i]) {
if (bestS < S[j]) {
bestS = S[j];
bestJ = j;
}
}
}
S[i] = 1 + bestS;
pre[i] = bestJ;
}
int maxS = S[0], maxI = 0;
for (i = 1; i < nr; i++) {
if (maxS < S[i]) {
maxS = S[i];
maxI = i;
}
}
printf("%d\n", maxS);
doprint(maxI, pre, data);
*/
return 0;
}
char A[2000010];
char B[2000010];
int strmatch_main() {
freopen("strmatch.in", "r", stdin);
freopen("strmatch.out", "w", stdout);
fgets(B, 2000010, stdin);
fgets(A, 2000010, stdin);
int nA = strlen(A);
if (A[nA - 1] == '\n') {
nA--;
A[nA] = 0;
}
int nB = strlen(B);
if (B[nB - 1] == '\n') {
nB--;
B[nB] = 0;
}
int i = nB, j, ok;
long long hashA = 0, hashB = 0;
for (i = 0; i < nB; i++) {
hashA ^= A[i];
hashB ^= B[i];
}
int nsols = 0;
int pos[1000];
while (1) {
if (hashA == hashB) {
ok = 1;
for (j = 0; j < nB; j++) {
if (A[i - nB + j] != B[j]) {
ok = 0;
break;
}
}
if (ok) {
if (nsols < 1000)
pos[nsols] = i - nB;
nsols++;
}
}
if (i < nA) {
hashA ^= A[i - nB];
hashA ^= A[i];
i++;
}
else {
break;
}
}
printf("%d\n", nsols);
for (i = 0; i < nsols && i < 1000; i++)
printf("%d ", pos[i]);
return 0;
}
int main(int argc, char **argv) {
//return stirling_main();
//return union_find_main();
//return evaluare_main();
//return scmax_main();
return strmatch_main();
}