Petrozavodsk Winter Camp, Andrew, 2014, Dichromatic Trees
条件:
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的更多相关文章
- 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}^ ...
- Petrozavodsk Winter Camp, Warsaw U, 2014, A The Carpet
一个地图上有若干障碍,问允许出现一个障碍的最大子矩形为多大? 最大子矩形改编 #include<bits/stdc++.h> using namespace std; #define re ...
- Petrozavodsk Winter Camp, Day 8, 2014, Ship
$dp(i,j)$表示i-j这段还没运走时的状态,包括 运输了多少次,还剩多少空间 每次枚举运输左边还是右边转移 #include <bits/stdc++.h> #define rep( ...
- Petrozavodsk Winter Camp, Day 8, 2014, Fine Brochures
1的个数-块的个数+多减的个数+flag 多减的只会在一个循环末尾出现 #include <bits/stdc++.h> using namespace std; #define rep( ...
- Petrozavodsk Winter Camp, Day 8, 2014, Second Trip
给你一棵树,每次询问一个(a,b),问有多少有路径与a-b没有交集 找lca #include <bits/stdc++.h> using namespace std; #define r ...
- Petrozavodsk Winter Camp, Day 8, 2014, Mosaic
给你三个数字a,b,c,让你用1-m的数字凑出来 结论:有2个1和2个2肯定凑不出来,然后就搜索 #include <bits/stdc++.h> using namespace std; ...
- 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 ...
- 2018 Petrozavodsk Winter Camp, Yandex Cup
A. Ability Draft solved by RDC 60min start, 148 min AC, 1Y 题意:两只 Dota 队伍,每队 \(n\) 个英雄,英雄一开始无技能,他们需要按 ...
- 2019 Petrozavodsk Winter Camp, Yandex Cup C. Diverse Singing 上下界网络流
建图一共建四层 第一层为N个歌手 第二层为{pi,li} 第三层为{si,li} 第四层为M首歌 除了S和第一层与第三层与T之间的边为[1,INF] 其他边均为[0,1] #include<bi ...
随机推荐
- python_代码中调用java类
1. 安装jpype (python调用java class文件用) 1.1. 自动安装:pip install jpype1 1.2. 手动方式安装jpype1 安装wheel:pip instal ...
- 017-并发编程-Condition
一.概述 任何一个Java对象,都拥有一组监视器方法,主要包括wait().notify().notifyAll()方法,这些方法与synchronized关键字配合使用可以实现等待/通知机制.使用这 ...
- block,inline和inline-block概念和区别(转载)
转自: http://www.cnblogs.com/KeithWang/p/3139517.html 总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-lev ...
- 二叉查找树ADT
二叉查找树ADT 定义:是一个二叉树,其中每一个节点的值大于左子树的所有值而小于右子树的所有值 平衡二叉树:平衡是指一个二叉树的任何节点的深度均不得过深 AVL树 定义:是一个二叉查找树,每个节点的左 ...
- word之个人设置
1.视图设置.五种视图中一般都是用“页面视图”.标尺和导航窗口都需要显示出来,方便操作,显示比例就用最真实的100%比例. 2.设置文件自动保存时间间隔和位置 3.word段落设置,不允许西文单词中间 ...
- dubbo框架整合常见问题
逆向工程常见问题总结 tomcat7插件启动项目卡在:log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for ...
- Jmeter接口测试+压力测试+环境配置+证书导出
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要安 ...
- WINDBG常用方法
前言:windbg大家都很熟悉,它是做windows系统客户端测试的QA人员很应该掌握的定位程序崩溃原因的工具, 网上也有很多资料,但是真正适合QA阅读和实用的资料不多,我把我认为最重要最应该掌握的结 ...
- Docker Kubernetes 查询字段说明
Docker Kubernetes 查询字段说明 # 打印受支持的API版本 kubectl api-versions # 扩展 apiextensions.k8s.io/v1beta1 # 注册 ...
- angular7 Rxjs 异步请求
Promise 和 RxJS 处理异步对比 Promise 处理异步: let promise = new Promise(resolve => { setTimeout(() => { ...