\(\mathcal{Description}\)

  Link.

  给定一个含 \(n\) 个结点 \(m\) 条边的简单无向图,每条边的边权是一个常数项为 \(0\) 的 \(T\) 次多项式,求所有从 \(1\) 结点出发回到 \(1\) 结点的环路中,边权之积的 \(T\) 次项系数和。

  \(n,m\le10\),\(T\le4\times10^4\)。

\(\mathcal{Solution}\)

  令 \(f_i(x)=\sum_{j\ge0}f_{i,j}x^j\),从 \(1\) 出发到 \(i\) 的所有路径边权积的和,那么对于一条边 \(e(u,v)\),设其边权为 \(g_e\),它会为 \(f\) 提供转移:

\[f_{u,i}\leftarrow f_{u,i}+\sum_{d=1}^T [x^d]g_ef_{v,i-d}
\]

\[f_u(x)\leftarrow f_u(x)+g_e(x)f_v(x)
\]

所以整体做一个分治 FFT 就能求出所有 \(f\)。复杂度 \(\mathcal O(mT\log^2T)\)。

\(\mathcal{Code}\)

  1. /*~Rainybunny~*/
  2. #include <cstdio>
  3. #include <vector>
  4. #include <cassert>
  5. #include <algorithm>
  6. #define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
  7. #define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
  8. typedef std::vector<int> Poly;
  9. const int MAXN = 10, MAXL = 1 << 17, MOD = 998244353;
  10. int N, M, T, eu[MAXN + 5], ev[MAXN + 5];
  11. Poly E[MAXN + 5], F[MAXN + 5];
  12. inline void subeq( int& a, const int b ) { ( a -= b ) < 0 && ( a += MOD ); }
  13. inline int sub( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
  14. inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
  15. inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); }
  16. inline int mul( const int a, const int b ) { return int( 1ll * a * b % MOD ); }
  17. inline int mpow( int a, int b ) {
  18. int ret = 1;
  19. for ( ; b; a = mul( a, a ), b >>= 1 ) ret = mul( ret, b & 1 ? a : 1 );
  20. return ret;
  21. }
  22. namespace PolyOper {
  23. const int MG = 3;
  24. int omega[17][MAXL];
  25. inline void init() {
  26. rep ( i, 0, 16 ) {
  27. int* oi = omega[i];
  28. oi[0] = 1, oi[1] = mpow( MG, MOD - 1 >> i >> 1 );
  29. rep ( j, 2, ( 1 << i ) - 1 ) oi[j] = mul( oi[j - 1], oi[1] );
  30. }
  31. }
  32. inline void ntt( Poly& u, const int type ) {
  33. static int rev[MAXL]; rev[0] = 0;
  34. int n = int( u.size() ), lgn = 1; for ( ; 1 << lgn < n; ++lgn );
  35. rep ( i, 1, n - 1 ) rev[i] = rev[i >> 1] >> 1 | ( i & 1 ) << lgn >> 1;
  36. rep ( i, 1, n - 1 ) if ( i < rev[i] ) {
  37. u[i] ^= u[rev[i]] ^= u[i] ^= u[rev[i]];
  38. }
  39. for ( int i = 0, stp = 1; stp < n; ++i, stp <<= 1 ) {
  40. int* oi = omega[i];
  41. for ( int j = 0; j < n; j += stp << 1 ) {
  42. rep ( k, j, j + stp - 1 ) {
  43. int ev = u[k], ov = mul( oi[k - j], u[k + stp] );
  44. u[k] = add( ev, ov ), u[k + stp] = sub( ev, ov );
  45. }
  46. }
  47. }
  48. if ( !~type ) {
  49. int ivn = MOD - ( MOD - 1 ) / n;
  50. rep ( i, 0, n - 1 ) u[i] = mul( u[i], ivn );
  51. std::reverse( u.begin() + 1, u.end() );
  52. }
  53. }
  54. } // namespace PolyOper.
  55. inline Poly operator * ( Poly u, Poly v ) {
  56. assert( u.size() && v.size() );
  57. int su = int( u.size() ), sv = int( v.size() ), len = 1;
  58. for ( ; len < su + sv - 1; len <<= 1 );
  59. u.resize( len ), v.resize( len );
  60. PolyOper::ntt( u, 1 ), PolyOper::ntt( v, 1 );
  61. rep ( i, 0, len - 1 ) u[i] = mul( u[i], v[i] );
  62. PolyOper::ntt( u, -1 );
  63. return u.resize( su + sv - 1 ), u;
  64. }
  65. inline void solve( const int l, const int r ) {
  66. if ( l == r ) return ;
  67. int mid = l + r >> 1;
  68. solve( l, mid );
  69. rep ( i, 1, M ) {
  70. int u = eu[i], v = ev[i];
  71. static Poly A, B, R;
  72. A = { F[u].begin() + l, F[u].begin() + mid + 1 };
  73. B = { E[i].begin() + 1, E[i].begin() + r - l + 1 };
  74. R = A * B;
  75. rep ( j, mid + 1, r ) addeq( F[v][j], R[j - l - 1] );
  76. A = { F[v].begin() + l, F[v].begin() + mid + 1 };
  77. B = { E[i].begin() + 1, E[i].begin() + r - l + 1 };
  78. R = A * B;
  79. rep ( j, mid + 1, r ) addeq( F[u][j], R[j - l - 1] );
  80. }
  81. solve( mid + 1, r );
  82. }
  83. int main() {
  84. PolyOper::init();
  85. scanf( "%d %d %d", &N, &M, &T );
  86. rep ( i, 1, M ) {
  87. scanf( "%d %d", &eu[i], &ev[i] ), --eu[i], --ev[i];
  88. E[i].resize( T + 1 );
  89. rep ( j, 1, T ) scanf( "%d", &E[i][j] );
  90. }
  91. rep ( i, 0, N - 1 ) F[i].resize( T + 1 );
  92. F[0][0] = 1, solve( 0, T );
  93. printf( "%d\n", F[0][T] );
  94. return 0;
  95. }

Solution -「ABC 213H」Stroll的更多相关文章

  1. Solution -「ABC 219H」Candles

    \(\mathcal{Description}\)   Link.   有 \(n\) 支蜡烛,第 \(i\) 支的坐标为 \(x_i\),初始长度为 \(a_i\),每单位时间燃烧变短 \(1\) ...

  2. Solution -「ABC 215H」Cabbage Master

    \(\mathcal{Description}\)   Link.   有 \(n\) 种颜色的,第 \(i\) 种有 \(a_i\) 个,任意两球互不相同.还有 \(m\) 个盒子,每个盒子可以被放 ...

  3. Solution -「ABC 213G」Connectivity 2

    \(\mathcal{Description}\)   Link.   给定简单无向图 \(G=(V,E)\),点的编号从 \(1\) 到 \(|V|=n\).对于 \(k=2..n\),求 \(H= ...

  4. Solution -「ABC 217」题解

    D - Cutting Woods 记录每一个切割点,每次求前驱后驱就好了,注意简单判断一下开闭区间. 考场上采用的 FHQ_Treap 无脑莽. #include <cstdio> #i ...

  5. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  6. Solution Set -「ABC 217」

      大家好屑兔子又来啦! [A - Lexicographic Order]   说个笑话,\(\color{black}{\text{W}}\color{red}{\text{alkingDead} ...

  7. Solution -「ARC 110E」Shorten ABC

    \(\mathcal{Description}\)   Link.   给定长度为 \(n\),包含 A, B, C 三种字符的字符串 \(S\),定义一次操作为将其中相邻两个不相同的字符替换为字符集 ...

  8. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  9. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

随机推荐

  1. 用一道题 来 复习 MySQL 的 复杂 sql 语句

    1.前言 太久没有在数据库做一些复杂的sql了,基本上将数据库的查询逻辑全放在了Java里做, 一来呢,可以减轻数据库的负担,二来呢,在java写,逻辑感会更强,数据类型更丰富也容易操作. 然而... ...

  2. 解析HetuEngine实现On Yarn原理

    摘要:本文介绍HetuEngine实现On Yarn的原理,通过阅读本文,读者可以了解HetuEngine如何在资源使用方面融入Hadoop生态体系. 本文分享自华为云社区<MRS HetuEn ...

  3. 深入理解Java虚拟机之Java内存区域与内存溢出异常

    Java内存区域与内存溢出异常 运行时数据区域 程序计数器 用于记录从内存执行的下一条指令的地址,线程私有的一小块内存,也是唯一不会报出OOM异常的区域 Java虚拟机栈 Java虚拟机栈(Java ...

  4. day 16 int *p; scanf("%d",p);问题

    (1).以下不能用于描述算法的是[A] (A).E-R图 (B).伪代码 (C).计算机语言 (D).流程图 分析:E-R图也称实体-联系图,提供了表示实体类型.属性和联系的方法,用来描述现实世界的概 ...

  5. Python实训day07pm【Selenium操作网页、爬取数据-下载歌曲】

    练习1-爬取歌曲列表 任务:通过两个案例,练习使用Selenium操作网页.爬取数据.使用无头模式,爬取网易云的内容. ''' 任务:通过两个案例,练习使用Selenium操作网页.爬取数据. 使用无 ...

  6. Xbatis:SpringBoot 数据管理框架

    目录 安装 下载源码 编译源码 添加依赖 数据表 数据源 Xbatis XbatisManager Database/Table/Column Column Table Database Create ...

  7. winform 中心旋转 图片旋转

    //设置左上角到中心点 g.TranslateTransform(int.Parse(x), int.Parse(y)); //旋转角度 g.RotateTransform(int.Parse(&qu ...

  8. 根据happens-before法则借助同步

    在文章的开始,我们先来看一段代码以及他的执行情况: public class PossibleRecording{ static int x = 0, y = 0; static int a = 0, ...

  9. dataTaDataTable 详细教程

    DataTable 选项说明 特性 jQueryUI:true/false:控制是否使用jqueryUI样式,需要引入jQueryUI的CSS autoWidth:true/false:控制Datat ...

  10. AOP操作-AspectJ配置文件

    AOP操作(AspectJ配置文件)(了解) (实际中大部分用注解方式) 1,创建两个类,增强类和被增强类,创建方法 2,在spring配置文件中创建两个类对象 3,在spring配置文件中配置切入点