题目大意:

给两个树,求环的个数。

题目分析:

出题人摆错题号系列。

通过画图很容易就能想到把新图拆在两个树上,在树上游走成环。

考虑DP状态F,G,T。F表示最终答案,T表示儿子不考虑父亲,G表示父亲不考虑儿子。T通过从下往上做NTT,G通过从上往下做NTT。F顺便做NTT。

最后做一下拼接就行。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = ;
  5. const int mod = ;
  6. const int gg = ;
  7.  
  8. int n[],k;
  9.  
  10. vector <int> g[][maxn];
  11.  
  12. int f[][maxn][],gi[][maxn][],T[][maxn][];
  13.  
  14. int C[][];
  15.  
  16. int fast_pow(int now,int pw){
  17. int ans = ,bit = ,dt = now;
  18. while(bit <= pw){
  19. if(bit & pw){ans = (1ll*ans*dt)%mod;}
  20. bit <<=; dt = (1ll*dt*dt)%mod;
  21. }
  22. return ans;
  23. }
  24.  
  25. void read(){
  26. scanf("%d%d%d",&n[],&n[],&k);
  27. for(int i=;i<n[];i++){
  28. int u,v; scanf("%d%d",&u,&v);
  29. g[][u].push_back(v); g[][v].push_back(u);
  30. }
  31. for(int i=;i<n[];i++){
  32. int u,v; scanf("%d%d",&u,&v);
  33. g[][u].push_back(v); g[][v].push_back(u);
  34. }
  35. }
  36.  
  37. int ord[];
  38.  
  39. void NTT(int *d,int len,int dr){
  40. for(int i=;i<len;i++) if(ord[i] < i) swap(d[i],d[ord[i]]);
  41. for(int i=;i<len;i<<=){
  42. int wn = fast_pow(gg,(mod-)/(*i));
  43. if(dr == -) wn = fast_pow(wn,mod-);
  44. for(int j=;j<len;j+=(i<<)){
  45. for(int k=,w=;k<i;k++,w = (1ll*w*wn)%mod){
  46. int x = d[j+k],y = (1ll*w*d[j+k+i])%mod;
  47. d[j+k] = (x+y)%mod;
  48. d[j+k+i] = (x-y+mod)%mod;
  49. }
  50. }
  51. }
  52. if(dr == -){
  53. int iv = fast_pow(len,mod-);
  54. for(int i=;i<len;i++) d[i] = (1ll*d[i]*iv)%mod;
  55. }
  56. }
  57.  
  58. int A[],B[];
  59. int fi[],A0[];
  60.  
  61. void INV(){
  62. int len = ,bit = ; while(len <= k) len<<=,bit++;
  63. memset(A0,,sizeof(A0));memset(fi,,sizeof(fi));
  64. A0[] = ;
  65. for(int i=,j=;i<=len;i<<=,j++){
  66. for(int k=;k<i;k++) fi[k] = A[k];
  67. int rl = i*,rb = j+;
  68. for(int k=;k<rl;k++) ord[k] = (ord[k>>]>>) + ((k&)<<rb-);
  69. NTT(A0,rl,); NTT(fi,rl,);
  70. for(int k=;k<rl;k++){
  71. A0[k] = (*A0[k]-(1ll*fi[k]*A0[k]%mod)*A0[k]%mod)%mod;
  72. if(A0[k] < ) A0[k] += mod;
  73. }
  74. NTT(A0,rl,-);
  75. for(int k=i;k<rl;k++) A0[k] = fi[k] = ;
  76. }
  77. for(int i=;i<=k;i++) A[i] = A0[i];
  78. }
  79.  
  80. void dfs1(int kd,int now,int fa){
  81. for(auto it:g[kd][now]){
  82. if(it == fa) continue;
  83. dfs1(kd,it,now);
  84. }
  85. memset(A,,sizeof(A));
  86. for(auto it:g[kd][now]){
  87. if(it == fa) continue;
  88. for(int i=;i<=k-;i+=) A[i+] = (A[i+]+T[kd][it][i])%mod;
  89. }
  90. A[] -= ; if(A[] < ) A[] += mod;
  91. for(int i=;i<=k;i++){ A[i] *= -; if(A[i] < ) A[i] += mod;}
  92. INV();
  93. for(int i=;i<=k;i++) T[kd][now][i] = A[i];
  94. }
  95.  
  96. void dfs2(int kd,int now,int fa){
  97. memset(B,,sizeof(B));
  98. for(auto it:g[kd][now]){
  99. if(it == fa) continue;
  100. for(int i=;i<=k-;i+=) B[i+] = (B[i+]+T[kd][it][i])%mod;
  101. }
  102. for(int i=;i<=k-;i+=) B[i+] = (B[i+]+gi[kd][now][i])%mod;
  103. for(auto it:g[kd][now]){
  104. if(it == fa) continue;
  105. for(int i=;i<=k-;i+=) B[i+] = (B[i+]+mod-T[kd][it][i])%mod;
  106. memset(A,,sizeof(A));
  107. for(int i=;i<=k;i++) A[i] = (mod-B[i])%mod; A[] = (-A[]+mod)%mod;
  108. INV(); for(int i=;i<=k;i++) gi[kd][it][i] = A[i];
  109. for(int i=;i<=k-;i+=) B[i+] = (B[i+]+T[kd][it][i])%mod;
  110. }
  111. memset(A,,sizeof(A));
  112. for(int i=;i<=k;i++) A[i] = (mod-B[i])%mod; A[] = (-A[]+mod)%mod;
  113. INV(); for(int i=;i<=k;i++) f[kd][now][i] = A[i];
  114. for(auto it:g[kd][now]){
  115. if(it == fa) continue;
  116. dfs2(kd,it,now);
  117. }
  118. }
  119.  
  120. void solve(int kd){
  121. dfs1(kd,,);
  122. dfs2(kd,,);
  123. }
  124.  
  125. void work(){
  126. solve();
  127. solve();
  128. for(int i=;i<=k;i++){
  129. C[i][] = C[i][i] = ;
  130. for(int j=;j<i;j++) C[i][j] = (C[i-][j] + C[i-][j-]) % mod;
  131. }
  132. int ans = ;
  133. for(int i=;i<=k;i++){
  134. int s1 = ,s2 = ;
  135. for(int j=;j<=n[];j++) s1 += f[][j][i],s1 %= mod;
  136. for(int j=;j<=n[];j++) s2 += f[][j][k-i],s2 %= mod;
  137. int pp = (1ll*s1*s2)%mod;pp = (1ll*C[k][i]*pp)%mod;
  138. ans += pp; ans %= mod;
  139. }
  140. printf("%d",ans);
  141. }
  142.  
  143. int main(){
  144. read();
  145. work();
  146. return ;
  147. }

Codeforces997D Cycles in product 【FFT】【树形DP】的更多相关文章

  1. 树形DP 2013多校8(Terrorist’s destroy HDU4679)

    题意: There is a city which is built like a tree.A terrorist wants to destroy the city's roads. But no ...

  2. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  3. poj2378 树形DP

    C - 树形dp Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit ...

  4. 秘密袭击 [BZOJ5250] [树形DP]

    分析: 听说正解是FFT+线段树合并,然而我并不会... 我们来思考其他的方法. 我们要求的是连通块第k大的和 对于某一个连通块,对答案的贡献=val(Rank.K) 我们不好直接算出每个连通块的Ra ...

  5. Codeforces Beta Round #14 (Div. 2) D. Two Paths 树形dp

    D. Two Paths 题目连接: http://codeforces.com/contest/14/problem/D Description As you know, Bob's brother ...

  6. Codeforces Beta Round #14 (Div. 2) Two Paths (树形DP)

    Two Paths time limit per test 2 seconds memory limit per test 64 megabytes input standard input outp ...

  7. 树的直径的求法即相关证明【树形DP || DFS】

    学习大佬:树的直径求法及证明 树的直径 定义: 一棵树的直径就是这棵树上存在的最长路径. 给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之间的距 ...

  8. 5.21 省选模拟赛 luogu P4297 [NOI2006]网络收费 树形dp

    LINK:网络收费 还是自己没脑子. 早上思考的时候 发现树形dp不可做 然后放弃治疗了. 没有合理的转换问题的模型是我整个人最大的败笔. 暴力也值得一提 爆搜之后可以写成FFT的形式的计算贡献的方法 ...

  9. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

随机推荐

  1. CentOS 7+nginx+PHP+php-fpm

    根据网上资料配置: location ~ \.php$ { #include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index in ...

  2. centos6.5 squid安装

    squid作用 1正向代理 标准的代理缓冲服务器,须在每一个内部主机的浏览器上明确指明代理服务器的IP地址和端口号. 透明代理缓冲服务器,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和 ...

  3. RuntimeError: Model class apps.users.models.User doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

    报错代码: File "/home/bsodgm/Desktop/Django_projection/mall/apps/users/views.py", line 9, in & ...

  4. Python学习第十一篇——for 的本质及如何正确修改列表

    假如现在有一个列表:magicians_list = ['mole','jack','lucy'],现在想通过一个函数来实现,在列表的每个元素前面加上“the Great”的字样.现在通过一个函数来实 ...

  5. Nice Garland CodeForces - 1108C (思维+暴力)

    You have a garland consisting of nn lamps. Each lamp is colored red, green or blue. The color of the ...

  6. echarts图片保存

    一.js: function updateChart(versionList,rateList) { option = { title: { text: '拖动频次' }, tooltip : { t ...

  7. 使用Browser请求 和 在cli中运行程序的分析

    在browser中请求后端的一个程序之后,立马将窗口关闭,服务器端的程序是否会挂起或者终止,还是继续执行? 如果是继续执行,那么执行完毕后,结果去了哪里?-->apache的工作流程 使用Bro ...

  8. PHP之CLI模式

    转载: http://www.cnblogs.com/zcy_soft/archive/2011/12/10/2283437.html 所有的PHP发行版,不论是编译自源代码的版本还是预创建的版本,都 ...

  9. js 通过url获取里面的参数值

    场景描述:当我们从一个页面要带有一两个值跳转到另一个页面,另一个页面要使用这些参数的时候,我们就需要通过js获取这些参数啦. 先贴上代码: function getQueryString(name) ...

  10. JavaScript中变量、执行环境、作用域与C#中的异同

    首先需要明确一个执行环境的概念,执行环境这个概念是用来理解作用域的,在js中,执行环境分为全局执行环境和局部(function)执行环境,而在C#这类的C类语言中,还有一个块级别的执行环境,如if语句 ...