首页 > 其他分享 >20240919 湘潭夏令营

20240919 湘潭夏令营

时间:2024-09-24 10:54:14浏览次数:1  
标签:dep 20240919 frac 湘潭 int fa qmod 夏令营 mod

Coin

假设 \(1 \leqslant n \leqslant 100\),可以想到去做一个矩阵乘法,记录一下每个位置到其他位置的概率。

尝试算一下概率,可以发现每个位置到除了它以外的每一个位置的概率都是 \(\frac{1}{2 \times (n - 1)}\),停留在原地的概率为 \(\frac{1}{2}\)。

但是可以发现,除了最初他在的位置,其他位置的情况都是相同的。

那么就可以把矩阵从 \(n \times n\) 转成 \(2 \times 2\)。

推导一下,我的矩阵长成这样:\(\begin{bmatrix} \frac{1}{2} & \frac{1}{2} \\ \frac{1}{2 \times (n-1)} & \frac{n - 2}{2 \times (n-1)}+\frac{1}{2} \end{bmatrix}\)

点击查看代码
#include <bits/stdc++.h>
#define _1 (__int128)1

using namespace std;
using ll = long long;

void FileIO (string s) {
  freopen((s + ".in").c_str(), "r", stdin);
  freopen((s + ".out").c_str(), "w", stdout);
}

const int mod = 998244353, MATsize = 5;

struct matrix {
  int a[MATsize][MATsize], n, m;
  void Clear (int x, int y, int f) {
    n = x, m = y;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++)
        a[i][j] = f;
  }
  void Unit (int x, int y) {
    Clear(x, y, 0);
    for (int i = 1; i <= n; i++)
      a[i][i] = 1;
  }
  matrix operator + (matrix y) {
    matrix z;
    z.n = n, z.m = m;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++)
        z.a[i][j] = a[i][j] + y.a[i][j];
    return z;
  }
  matrix operator * (matrix y) {
    matrix z;
    z.n = n, z.m = y.m;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= y.m; j++) {
        z.a[i][j] = 0;
        for (int k = 1; k <= m; k++)
          z.a[i][j] = (z.a[i][j] + 1ll * a[i][k] * y.a[k][j] % mod) % mod;
      }
    return z;
  }
} ;

matrix MATqmod (matrix x, ll y) {
  matrix sum;
  sum.Unit(x.n, x.m);
  while (y) sum = (y & 1 ? sum * x : sum), x = x * x, y >>= 1;
  return sum;
}

int qmod (int x, int y) {
  int ret = 1;
  while (y) ret = (y & 1 ? 1ll * ret * x % mod : ret), x = 1ll * x * x % mod, y >>= 1;
  return ret;
}

ll n, k, x;
matrix a, b;

signed main () {
  ios::sync_with_stdio(0), cin.tie(0);
  // FileIO("");
  cin >> n >> x >> k;
  a.Clear(1, 2, 0), a.a[1][1] = 1;
  b.Clear(2, 2, 0), b.a[1][1] = qmod(2, mod - 2), b.a[1][2] = qmod(2, mod - 2), b.a[2][1] = 1ll * qmod(2, mod - 2) * qmod((n - 1) % mod, mod - 2) % mod, b.a[2][2] = ((n - 2) % mod * qmod((2 * n - 2) % mod, mod - 2) + qmod(2, mod - 2)) % mod;
  a = a * MATqmod(b, k);
  /*a = a * b;
  cout << a.a[1][1] << ' ' << a.a[1][2] << '\n';
  a = a * b;
  cout << a.a[1][1] << ' ' << a.a[1][2] << '\n';*/
  //assert((a.a[1][1] + a.a[1][2]) % mod == 1);
  cout << (x % mod * a.a[1][1] + ll((_1 * n * (n + 1) / 2 - x) % mod) * a.a[1][2] % mod * qmod((n - 1) % mod, mod - 2)) % mod;
  return 0;
}

Iwanna

结论:答案就是所有边的边权总和减去以 s 为根时 t 的子树范围内的边权之和。证明如下。

image

预处理后做个 lca,分类讨论一下即可。

点击查看代码
#include <bits/stdc++.h>
#define _1 (__int128)1

using namespace std;
using ll = long long;

void FileIO (const string s) {
  freopen(string(s + ".in").c_str(), "r", stdin);
  freopen(string(s + ".out").c_str(), "w", stdout);
}

const int N = 5e5 + 10, mod = 998244353;

int n, q, sum[N], fa[N][20], dep[N], x, y, fa_[N];
vector<pair<int, int>> g[N];

void dfs (int x) {
  dep[x]++;
  for (int i = 1; i <= 18; i++)
    fa[x][i] = fa[fa[x][i - 1]][i - 1];
  for (auto [i, j] : g[x])
    if (i != fa[x][0])
      fa[i][0] = x, fa_[i] = j, dep[i] = dep[x], dfs(i), sum[x] = (0ll + sum[x] + sum[i] + j) % mod;
}

int lca (int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = 18; i >= 0; i--)
    if ((dep[x] - dep[y]) >> i & 1)
      x = fa[x][i];
  if (x == y) return x;
  for (int i = 18; i >= 0; i--)
    if (fa[x][i] != fa[y][i])
      x = fa[x][i], y = fa[y][i];
  return fa[x][0];
}

signed main () {
  ios::sync_with_stdio(0), cin.tie(0);
  // FileIO("");
  cin >> n >> q;
  for (int i = 1, x, y, z; i < n; i++)
    cin >> x >> y >> z, g[x].push_back({y, z}), g[y].push_back({x, z});
  dfs(1);
  while (q--) {
    cin >> x >> y;
    if (x == y) {
      cout << "0\n";
      continue;
    }
    if (lca(x, y) == y) {
      int z = x;
      for (int i = 18; i >= 0; i--)
        if ((dep[x] - dep[y] - 1) >> i & 1)
          z = fa[z][i];
      cout << (sum[z] + fa_[z]) % mod;
    } else {
      cout << (sum[1] - sum[y] + mod) % mod;
    }
    cout << '\n';
  }
  return 0;
}

标签:dep,20240919,frac,湘潭,int,fa,qmod,夏令营,mod
From: https://www.cnblogs.com/wnsyou-blog/p/18428379/plb-20240919

相关文章

  • 20240919_214407 切片小结 树的遍历 随手笔记
    切片小结步长如果是正值那么找到下标的对应的成员左边切一刀最终向右包抄取值步长如果是负值找到下标对应的成员右边切一刀最终向左边包抄取值认识库SciPy:SciPy是一个开源的Python算法库和数学工具包,用于数学、科学、工程领域。它基于NumPy,提供了大量的数学算法和......
  • leetcode-2414|菜鸟提升日记20240919
    数模打完后一直萎靡不振。。。今天小菜鸟终于支棱起来了!继续加油(ง•_•)ง题目:字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串 "abcdefghijklmnopqrstuvwxyz" 的任意子字符串都是 字母序连续字符串 。例如,"abc" 是一个字母序连续字符串,而 "......
  • Datawhale X李宏毅苹果书AI夏令营 第五期 深度学习入门 task3
      本次任务主要是了解模型在训练集或测试集上损失较大时的几大原因,了解改进的方向一、模型偏差   模型过于简单,未知参数函数的所有可能性的集合太小,让损失变低的函数不在模型可以描述的范围内;或者是模型的灵活性不够。这个时候重新设计一个模型,给模型更大的灵活性,将......
  • Datawhale X 李宏毅苹果书 AI夏令营(进阶Task03)
    批量归一化为什么不同的参数在更新时其梯度变化如此之大?首先,对于模型中w1,w2两个参数,可以看到其w1参数的梯度变化较为平滑,w2梯度变化较为陡峭,原因是x1较小时,当w1变化较大,由于x1较小,其整体乘积较小,对损失值影响不大;x2较大时,w2发生变化,其乘积较大,其对损失值变化很大,影响较大。......
  • Datawhale X 李宏毅苹果书AI夏令营 Task3打卡
    3.7批量归一化批量归一化的核心思想在于把误差函数图像的“山铲平”,在某些误差表面上不同参数方向的变化率可能差别很大,此时在损失函数上找到临界点会比较困难比如对一个简单的线性函数\(y=\sigma(w_1\timesx_1+w_2\timesx_2+b)\)来说,我们考虑对于参数\(w_1,w_2\)来说,......
  • 第二天学习笔记:Datawhale X 李宏毅苹果书 AI夏令营
    今天学的有些小兴奋,终于解锁了很多熟悉但不明就里的术语。天呢,原来ReLU是“修正线性单元”的意思!RectifiedLinearUnit!但是呢,也有不大对付的地方:好几个地方前言不搭后语。容我一一道来。今天就顺序边读边记:线性模型(linearmodel)==把模型输入的特征x乘上一个权重,再加......
  • 2、实践方法论(Datawhale X 李宏毅苹果书 AI 夏令营)
    2、实践方法论(DatawhaleX李宏毅苹果书AI夏令营)在应用机器学习算法时,实践方法论能够帮助我们更好地训练模型。如果在Kaggle上的结果不太好,虽然Kaggle上呈现的是测试数据的结果,但要先检查训练数据的损失。2.1模型偏差有时候把模型设置的太过简单,使得函数的集合太小了,没......
  • Datawhale X 李宏毅苹果书 AI夏令营-深度学习入门班-task3-机器学习实践方法论
    引入在简单了解到机器学习的过程,以及模型函数的优化升级之后,我们需要根据一些方法论,解决模型实践过程中会遇到的问题,学会分析模型数据,按照正确的路径优化模型,减少测试误差(TestingLoss)。实践方法论整体框架下图是实践方法论的整体框架,下文会根据逻辑顺序一一介绍。step......
  • Datawhale X 李宏毅苹果书 AI夏令营 Task3-机器学习实践方法论
    在上一章介绍完机器学习模型后,我们接着讨论模型中可能存在的一些问题。首先我们需要明确一件事,就是Kaggle上的测试结果不好,可能有多个原因。第一,如果模型在运行训练模型时,所产生的损失就很大,那么有可能是模型偏差(modelbias)或优化(optimization)问题。第二,如果模型在运行训......
  • Datawhale X 李宏毅苹果书 AI夏令营-深度学习入门篇-Task3《深度学习详解》- 实践方法
     核心学习目标:通过《深度学习详解》和李宏毅老师21年的机器学习课程视频,入门机器学习,并尝试学习深度学习,展开代码实践(选修)。该书保留了李宏毅老师公开课中大量生动有趣的例子,帮助读者从生活化的角度理解深度学习的概念、建模过程和核心算法细节,包括卷积神经网络、Transform......