首页 > 其他分享 >Codeforces 954H Path Counting

Codeforces 954H Path Counting

时间:2024-04-21 20:44:05浏览次数:27  
标签:limits int ll Codeforces ge Path Counting sum mod

令输入的为 \(a'\),同时 \(a'_0 = 1\)。
对其做一个前缀积 \(a_i = \prod\limits_{i = 0}^i a'_i\),对于 \(i\ge n\),认为 \(a_i = 0\)。
那么 \(a_i\) 就相当于是深度 \(i + 1\) 的点的个数。
同时也可以得到根的深度为 \(l\) 时子树内深度为 \(r\) 的深度的点数为 \(\dfrac{a_{r - 1}}{a_{l - 1}}\)。

考虑固定了距离为 \(d\) 来算。
那么有两种情况:

  1. 两点为祖先关系,那么考虑到深度 \(\ge d + 1\) 的点都能找到其祖先。
    所以贡献就为 \(\sum\limits_{i = d}^{n - 1} a_i\)。
  2. 两点不为祖先关系,考虑枚举 \(\text{LCA}\) 的深度 \(i\),那么就会有 \(a_{i - 1}\) 个点。
    首先这两个点不能为祖先关系,所以对于 \(\text{LCA}\),这两个点一定在其两个不同的儿子的子树中,这部分的方案数就为 \(\binom{a'_i}{2} = \binom{\frac{a_i}{a_{i - 1}}}{2}\)。
    然后考虑枚举其中一个点的深度为 \(i + j(1\le j < d)\),那么另一个点的深度就为 \(i + d - j\),那么方案数就为 \(\dfrac{a_{i + j - 1} a_{i + d - j - 1}}{a_i^2}\)。
    于是方案数就相当于是 \(\sum\limits_{i = 1}^{n - 1} a_{i - 1}\binom{\frac{a_i}{a_{i - 1}}}{2}\frac{1}{a_i^2}\sum\limits_{1\le j < d} a_{i + j - 1} a_{i + d - j - 1}\)。

考虑优化第二部分。
能发现主要是 \(\sum\limits_{1\le j < d} a_{i + j - 1} a_{i + d - j - 1}\) 这部分每次都需要 \(\mathcal{O}(n)\) 的复杂度,考虑优化这部分。
令 \(f_{i, d} = \sum\limits_{1\le j < d} a_{i + j - 1} a_{i + d - j - 1}\),能发现这也就是 \(\sum\limits_{x, y\ge i, x + y = 2i + d - 2} a_x a_y\)。
初始情况显然有 \(f_{i, 1} = 0, f_{i, 2} = a_i^2\)。
对于 \(d\ge 3\),考虑 \(f_{i + 1, d - 2} = \sum\limits_{x, y\ge i + 1, x + y = 2i + d - 2} a_x a_y\),能发现 \(f_{i, d} - f_{i + 1, d - 2} = a_i a_{i + d - 2} + a_{i + d - 2} a_i = 2a_i a_{i + d - 2}\),所以有 \(f_{i, d} = f_{i + 1, d - 2} + 2a_i a_{i + d - 2}\),便可以 \(\mathcal{O}(1)\) 递推了。

注意到 \(f_{i, d}\) 的递推只与 \(f_{i + 1, d + 2}\) 有关,可以把 \(d\) 这一维压成 \(0 / 1\)。

时间复杂度 \(\mathcal{O}(n^2)\)。

代码
#include<bits/stdc++.h>
using ll = long long;
const ll mod = 1e9 + 7;
inline ll binom2(ll n) {
   return n * (n - 1) / 2 % mod;
}
inline ll qpow(ll a, ll b, ll v = 1) {
   while (b) {
      if (b & 1) (v *= a) %= mod;
      b >>= 1, (a *= a) %= mod;
   }
   return v;
}
const int maxn = 5e3 + 10;
ll a[maxn], inva[maxn];
ll f[maxn][2];
int main() {
   int n;
   scanf("%d", &n);
   int m = 2 * n - 2;
   a[0] = 1;
   for (int i = 1; i < n; i++)
      scanf("%lld", &a[i]);
   for (int i = 1; i < n; i++)
      (a[i] *= a[i - 1]) %= mod;
   for (int i = 0; i < n; i++)
      inva[i] = qpow(a[i], mod - 2);
   for (int d = 1; d <= m; d++) {
      ll ans = 0;
      for (int i = 1; i + d <= n; i++)
         (ans += a[i + d - 1]) %= mod;
      if (d == 1);
      else if (d == 2) {
         for (int i = 1; i < n; i++)
            f[i][d & 1] = a[i] * a[i] % mod;
      } else {
         for (int i = 1; i < n; i++) {
            f[i][d & 1] = f[i + 1][d & 1];
            if (i + d - 1 <= n)
               (f[i][d & 1] += 2ll * a[i] * a[i + d - 2]) %= mod;
         }
      }
      for (int i = 1; i < n; i++)
         (ans += f[i][d & 1] % mod * inva[i] % mod * inva[i] % mod
                 * binom2(a[i] * inva[i - 1] % mod) % mod * a[i - 1] % mod) %= mod;
      printf("%lld ", ans);
   }
   return 0;
}

标签:limits,int,ll,Codeforces,ge,Path,Counting,sum,mod
From: https://www.cnblogs.com/rizynvu/p/18149475

相关文章

  • ABC 287 C - Path Graph?
    题目链接:首先根据条件$-对于所有i=1,2,…,N−1,有一条边连接顶点v_i$和\(v_{i+1}\)可以得到,路径图必须有\(N-1\)条边。其次,Ifintegers\(i\)and\(j\)satisfies\(1\leqi,j\leqN\)and\(|i-j|\geq2\),thenthereisnoedgethatconnectsvertices\(......
  • Codeforces 954I Yet Another String Matching Problem
    考虑到这个答案怎么算。能发现相当于是对应的字符间相连边,那么一个连通块中的字符就要变成同一个字符。于是一个连通块的代价就是\(sz-1\)。所以令有\(x\)个连通块,最后的代价就是\(|\Sigma|-x\)。考虑到因为\(|\Sigma|=6\),而\(B_6=203\)(贝尔数,\(B_n\)意义为大......
  • dbt asset-paths 简单说明
    dbt的asset-paths是一个比较有意思的配置,可以用来增强我们的文档信息,比如存放一些图片在资源描述中引用资源生成的文档中可以进行显示,提示文档的信息参考配置dbt_project.ymlasset-paths:["assets"]使用假如assets包含一些描述图片信息models/ap......
  • [ABC232G] Modulo Shortest Path (优化建图)
    链接:https://www.luogu.com.cn/problem/AT_abc232_g暴力的做法肯定不行,这道题要用到一个比较经典的拆点操作:把一个点拆成内点和外点。在接下来的分析中会慢慢介绍。由于题目每次连的边都是单向边,那要考虑的问题是:比如说现在要从1走到3,怎么走才能与暴力建边等价。先不考虑取模这......
  • Codeforces 1824C LuoTianyi and XOR-Tree
    考虑到肯定如果能在这个节点让子树的值尽量相同肯定更好,这样子不会与上面的操作相冲突。于是有个\(\text{DP}\)的思路。记\(f_{u,i}\)为\(u\)子树内叶子节点的值都变为\(i\)的最小代价。这个有一个很好的性质,就是\(\maxf_{u,i}-\minf_{u,i}=1\)。这是因为考......
  • Codeforces Round 932 (Div. 2)题解(c、d)
    CodeforcesRound932(Div.2)C.MessengerinMAC题目大意给定一些\(a_i\)\(和b_i\),选出尽量多的\(a_i和b_i\),使得\(\sum_{i=1}^ka_{p_i}+\sum_{i=1}^{k-1}\left|b_{p_i}-b_{p_{i+1}}\right|\)小于给定的\(l\)。题目解析由于题目没有要求\(\{p\}\)是升序排列的序列,因此......
  • .net 6 C#中System.IO.Path类的用法
    1.说明/*PerformsoperationsonSystem.Stringinstancesthatcontainfileordirectorypathinformation.Theseoperationsareperformedinacross-platformmanner.对系统执行操作。包含文件或目录的字符串实例路径信息。这些操作是以跨平台的方式执行的。*/......
  • AT_abc211_d [ABC211D] Number of Shortest paths 题解
    题目简述给定一张$n$个点$m$条边的无向无权图,问从$1$到$n$的最短路有多少条。题目分析设$cnt_i$表示从$1$到$i$的最短路条数,$dis_i$表示最短路。这道题可以考虑使用BFS做,对于一个点$v$,设第一次更新它的点为$u$,则它的转移应为$cnt_v\leftarrowcnt_u$并......
  • Educational Codeforces Round 163 (Rated for Div. 2) 补题记录(A~A)
    A容易发现若\(S\)串中\(s_i\)为特殊字符,则令\(s_i=s_{i+1}\),此时\(s_i\neqs_{i-1}\)。则找到一个\(j\)满足\(s_i=s_{i+1}=s_{i+2}=\ldots=s_j\neqs_{j+1}\),则\(s_j\)也一定为特殊字符。所以若\(2\midn\)则构造\(\frac{n}{2}\)个AAB,否则必然无解。#include<......
  • Educational Codeforces Round 157 (Rated for Div. 2) 复盘
    又是vp的稀烂的一场。A没问题。被B一道800卡了。但是确实非常简单,就是从式子上入手,让\(|x_1-x_2|+|y_1-y_2|\)最小就可以了。所以就把两维度分开来看,这两维之间的距离是不会影响代价的,这是曼哈顿距离的特点。那么就很明显了,就是从中间分开。但是我vp的时候并没有看出来。而是......