#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100, mod = 998244353, inf = 2e9;
int n, p[N], v[N], x[N], cnt, ans;
int qpow(int x, int y) {
  int ret = 1;
  while (y) {
    if (y & 1) ret = 1ll * ret * x % mod;
    x = 1ll * x * x % mod, y >>= 1;
  }
  return ret;
}
struct node {
  int x, y, p, q, tp;
  bool operator<(const node &tp) const {
    return 1ll * p * tp.q < 1ll * q * tp.p;
  }
} res[N * 3];
struct matrix {
  int s[2][2];
  void init(int o) {
    if (o == 1)
      for (int i = 0; i < 2; ++i)
        for (int j = 0; j < 2; ++j) s[i][j] = (i == j);
    else {
      for (int i = 0; i < 2; ++i)
        for (int j = 0; j < 2; ++j) s[i][j] = 0;
      s[0][0] = 1;
    }
  }
  matrix operator*(matrix b) {
    matrix ret;
    for (int i = 0; i < 2; ++i)
      for (int j = 0; j < 2; ++j) {
        ret.s[i][j] = 0;
        for (int k = 0; k < 2; ++k)
          ret.s[i][j] = (ret.s[i][j] + 1ll * s[i][k] * b.s[k][j]) % mod;
      }
    return ret;
  }
} trans[N], I, H;
struct SegmentTree {
  int L[N << 2], R[N << 2];
  matrix F[N << 2];
  void build(int k, int l, int r) {
    L[k] = l, R[k] = r;
    if (l == r) {
      F[k] = trans[l];
      return;
    }
    int mid = l + r >> 1;
    build(k << 1, l, mid);
    build(k << 1 | 1, mid + 1, r);
    F[k] = F[k << 1] * F[k << 1 | 1];
  }
  matrix Query(int k, int l, int r) {
    if (r < l) return I;
    if (l <= L[k] && R[k] <= r) {
      return F[k];
    }
    int mid = L[k] + R[k] >> 1;
    matrix ret = I;
    if (l <= mid) ret = Query(k << 1, l, r);
    if (r > mid) ret = ret * Query(k << 1 | 1, l, r);
    return ret;
  }
  void Modify(int k, int x) {
    if (L[k] == R[k]) {
      F[k] = trans[x];
      return;
    }
    int mid = L[k] + R[k] >> 1;
    if (x <= mid)
      Modify(k << 1, x);
    else
      Modify(k << 1 | 1, x);
    F[k] = F[k << 1] * F[k << 1 | 1];
  }
} Tr;
int main() {
  scanf("%d", &n);
  for (int i = 1, c = qpow(100, mod - 2); i <= n; ++i)
    scanf("%d%d%d", &x[i], &v[i], &p[i]), p[i] = mod + 1 - 1ll * c * p[i] % mod,
                                          p[i] %= mod;
  if (n == 1) {
    puts("0");
    return 0;
  }
  for (int i = 2; i <= n; ++i) {
    if (v[i] > v[i - 1])
      res[++cnt] = (node){i - 1, i, x[i] - x[i - 1], v[i] - v[i - 1], 0};
    res[++cnt] = (node){i - 1, i, x[i] - x[i - 1], v[i] + v[i - 1], 1};
    if (v[i - 1] > v[i])
      res[++cnt] = (node){i - 1, i, x[i] - x[i - 1], v[i - 1] - v[i], 2};
  }
  sort(res + 1, res + cnt + 1);
  I.init(1);
  H.init(2);
  for (int i = 1; i <= n; ++i)
    trans[i].s[0][0] = trans[i].s[1][0] = p[i],
    trans[i].s[0][1] = trans[i].s[1][1] = (mod + 1 - p[i]) % mod;
  Tr.build(1, 1, n);
  for (int i = 1; i <= cnt; ++i) {
    int x = res[i].x, y = res[i].y;
    matrix pre = Tr.Query(1, 1, x), suf = Tr.Query(1, y + 1, n), Y;
    Y.init(2);
    Y.s[0][0] = 0;
    if (res[i].tp == 0) Y.s[0][0] = p[y];
    if (res[i].tp == 1) Y.s[1][0] = p[y];
    if (res[i].tp == 2) Y.s[1][1] = (1 + mod - p[y]) % mod;
    matrix tmp = pre * Y * suf;
    ans = (ans + 1ll * (tmp.s[0][1] + tmp.s[0][0]) * res[i].p % mod *
                     qpow(res[i].q, mod - 2) % mod) %
          mod;
    if (res[i].tp == 0) trans[y].s[0][0] = 0;
    if (res[i].tp == 1) trans[y].s[1][0] = 0;
    if (res[i].tp == 2) trans[y].s[1][1] = 0;
    Tr.Modify(1, y);
  }
  printf("%d", ans);
  return 0;
}
