条件:

1:每个红色节点的儿子都是黑色节点

2.每个叶子到根路径上的黑点数相等,等于某个常数,称作树的black height

求给定black height和节点数的符合条件的方案数

$black_{h} = x (black_{h-1} + red_{h-1})^2$

$red_{h} = x black_{h}^2$

任意模数的fft

#include <bits/stdc++.h>
using namespace std;
#define rep(i, j, k) for (int i = int(j); i <= int(k); ++ i)
#define dwn(i, j, k) for (int i = int(j); i >= int(k); -- i)
typedef long long LL;
const int MOD = ;
const int N = << ;
const long double PI = acos(-.);
LL red[][N], black[][N], M = ;
struct Complex {
long double r, i;
Complex(long double _r = , long double _i = ) {
r = _r; i = _i;
}
Complex operator + (const Complex &rhs) const {
return Complex(r + rhs.r, i + rhs.i);
}
Complex operator - (const Complex &rhs) const {
return Complex(r - rhs.r, i - rhs.i);
}
Complex operator * (const Complex &rhs) const {
return Complex(r * rhs.r - i * rhs.i, r * rhs.i + i * rhs.r);
}
Complex operator / (long double b) const {
return Complex(r / b, i / b);
}
};
int a[N], b[N], c[N];
Complex conj(Complex &a) {
return Complex(a.r, -a.i);
}
void fft(Complex *a, int n, int t) {
int k = ;
while (( << k) < n) k ++;
rep(i, , n - ) {
int t = ;
rep(j, , k - ) if ((i >> j) & ) t |= ( << (k - - j));
if (i < t) swap(a[i], a[t]);
} for (int l = ; l <= n; l <<= ) {
int m = l >> ;
long double o = * PI / l * t; Complex _w(cos(o), sin(o));
for (int i = ; i < n; i += l) {
Complex w(, );
rep(j, , m - ) {
Complex x = w * a[i + j + m];
a[i + j + m] = a[i + j] - x;
a[i + j] = a[i + j] + x;
w = w * _w;
}
}
}
if (t == -) rep(i, , n - ) a[i] = a[i] / n;
}
void Mul(int *A, int *B, int *C, int len, LL P) {
for(int i = ;i < len; ++i) (A[i] += P) %= P, (B[i] += P) %= P;
static Complex a[N], b[N], Da[N], Db[N], Dc[N], Dd[N];
for(int i = ;i < len; ++i) a[i] = Complex(A[i] & M, A[i] >> );
for(int i = ;i < len; ++i) b[i] = Complex(B[i] & M, B[i] >> );
fft(a, len, ); fft(b, len, );
for(int i = ;i < len; ++i) {
int j = (len - i) & (len - ); static Complex da, db, dc, dd;
da = (a[i] + conj(a[j])) * Complex(0.5, );
db = (a[i] - conj(a[j])) * Complex(, -0.5);
dc = (b[i] + conj(b[j])) * Complex(0.5, );
dd = (b[i] - conj(b[j])) * Complex(, -0.5);
Da[j] = da * dc; Db[j] = da * dd; Dc[j] = db * dc; Dd[j] = db * dd; //顺便区间反转,方便等会直接用DFT代替IDFT
}
for(int i = ;i < len; ++i) a[i] = Da[i] + Db[i] * Complex(, );
for(int i = ;i < len; ++i) b[i] = Dc[i] + Dd[i] * Complex(, );
fft(a, len, ); fft(b, len, );
for(int i = ;i < len; ++i) {
int da = (LL) (a[i].r / len + 0.5) % P; //直接取实部和虚部
int db = (LL) (a[i].i / len + 0.5) % P;
int dc = (LL) (b[i].r / len + 0.5) % P;
int dd = (LL) (b[i].i / len + 0.5) % P;
C[i] = (da + ((LL)(db + dc) << ) + ((LL)dd << )) % P;
}
} int main() {
red[][] = ; red[][] = ;
int len1 = << , len2 = << ; rep(h, , ) {
rep(i, , len1 - ) a[i] = (black[h - ][i] + red[h - ][i]) % MOD, b[i] = a[i];
rep(i, len1, len2 - ) a[i] = b[i] = ;
Mul(a, b, c, len2, MOD);
rep(i, , len1) black[h][i] = c[i - ];
rep(i, , len1 - ) a[i] = black[h][i], b[i] = a[i];
rep(i, len1, len2 - ) a[i] = b[i] = ;
Mul(a, b, c, len2, MOD);
rep(i, , len1) red[h][i] = c[i - ];
} rep(i, , len1) rep(j, , ) {
(red[j][i] += red[j - ][i]) %= MOD;
(black[j][i] += black[j - ][i]) %= MOD;
}
// rep(i, 0, 10) cout << black[1][i] << ' '; cout << '\n';
int k, H, n;
scanf("%d%d", &k, &H);
rep(i, , k) {
scanf("%d", &n);
cout << (red[H][n] + black[H][n]) % MOD << '\n';
}
}

Petrozavodsk Winter Camp, Andrew, 2014, Dichromatic Trees的更多相关文章

  1. Petrozavodsk Winter Camp, Andrew, 2014, Bipartite Bicolored Graphs

    由i个点和j个点组成的二分图个数为 $3^{ij}$,减去不联通的部分得到得到由i,j个点组成的联通二分图个数 $g_{i,j} = 3_{ij} - \sum_{k=1}^i \sum_{l=0}^ ...

  2. Petrozavodsk Winter Camp, Warsaw U, 2014, A The Carpet

    一个地图上有若干障碍,问允许出现一个障碍的最大子矩形为多大? 最大子矩形改编 #include<bits/stdc++.h> using namespace std; #define re ...

  3. Petrozavodsk Winter Camp, Day 8, 2014, Ship

    $dp(i,j)$表示i-j这段还没运走时的状态,包括 运输了多少次,还剩多少空间 每次枚举运输左边还是右边转移 #include <bits/stdc++.h> #define rep( ...

  4. Petrozavodsk Winter Camp, Day 8, 2014, Fine Brochures

    1的个数-块的个数+多减的个数+flag 多减的只会在一个循环末尾出现 #include <bits/stdc++.h> using namespace std; #define rep( ...

  5. Petrozavodsk Winter Camp, Day 8, 2014, Second Trip

    给你一棵树,每次询问一个(a,b),问有多少有路径与a-b没有交集 找lca #include <bits/stdc++.h> using namespace std; #define r ...

  6. Petrozavodsk Winter Camp, Day 8, 2014, Mosaic

    给你三个数字a,b,c,让你用1-m的数字凑出来 结论:有2个1和2个2肯定凑不出来,然后就搜索 #include <bits/stdc++.h> using namespace std; ...

  7. Petrozavodsk Winter Camp, Day 8, 2014, Rectangle Count

    给一个n*m的格点图,问其中有多少个矩形? $ \sum_{x=1}^{nm} \sum_{ab=x} [a + b \leq n](n - a - b + 1)\sum_{cd=x} [c + d ...

  8. 2018 Petrozavodsk Winter Camp, Yandex Cup

    A. Ability Draft solved by RDC 60min start, 148 min AC, 1Y 题意:两只 Dota 队伍,每队 \(n\) 个英雄,英雄一开始无技能,他们需要按 ...

  9. 2019 Petrozavodsk Winter Camp, Yandex Cup C. Diverse Singing 上下界网络流

    建图一共建四层 第一层为N个歌手 第二层为{pi,li} 第三层为{si,li} 第四层为M首歌 除了S和第一层与第三层与T之间的边为[1,INF] 其他边均为[0,1] #include<bi ...

随机推荐

  1. session_unset 与 session_destroy 区别

    session_unset() 释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的session id session_destroy() 删除当前用户对 ...

  2. git:当本地分支中的代码和develop分支上有很多冲突,希望删掉本地分支,重新建立新的分支,怎么解决?

    git:当本地分支中的代码和develop分支上有很多冲突,希望删掉本地分支,重新建立新的分支,但是git中说你需要先解决当前的冲突,这种情况怎么解决 这种情况可以在代码编辑器中点击commit,然后 ...

  3. Spring 学习教程(一):浅谈对Spring IOC以及DI的理解

    一.个人对IoC(控制反转)和DI(依赖注入)的理解我们平时在开发java web程序的时候,每个对象在需要使用它的合作对象时,自己都要将它要合作对象创建出来(比如 new 对象),这个合作对象是由自 ...

  4. property 和 魔法方法

    property和魔法方法 一.property 二.model,class,bases,mro 三.__doc__, __dict__,__call__,__item__,__len__,__str ...

  5. mybatis 转义

    当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序 ...

  6. xampp lampp 改变网页root目录的方法

    This is an old question but I haven't seen it properly answered yet. Here is what you need to do: In ...

  7. emqtt日志、证书、集群状态等位置

    1.日志 进入pod后,cd /var/log/emqttd/ 可以看到四种日志 2.证书等位置 cd /etc/emqttd 3.集群状态查询位置 任意位置 emqttd_ctl cluster s ...

  8. C++ const用法 尽可能使用const

    C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.c ...

  9. 最小生成树模板题 hpu 积分赛 Vegetable and Road again

    问题 H: Vegetable and Road again 时间限制: 1 Sec 内存限制: 128 MB 提交: 19 解决: 8 题目描述 修路的方案终于确定了.市政府要求任意两个公园之间都必 ...

  10. django中的数据库迁移

    Django是用python写的web开发框架,其特点是: 1.重量级框架,内部封装了很多的功能组件,使开发变的简便快速, 2.MVT模式:前后端分离,高内聚低耦合,m:model,与mvc中的m功能 ...