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 ...
随机推荐
- etree导入问题
原因:主要是lxml没有这个包的问题,需要安装下: 1.需要在https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 下选择你和你对应的pycharm对应的版 ...
- 使用jfreechart生成柱状图、折线图、和饼状图
JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计.下面我就详细介绍如 ...
- [LeetCode] 系统刷题3_Binary search
可以参考 [LeetCode] questions conclusion_ Binary Search
- js回溯法计算最佳旅行线路
假如有 A,B,C,D四个城市,他们之间的距离用 G[V][E] 表示,为 无穷大,则表示两座城市不相通 现在从计算从某一个城市出发,把所有的城市不重复旅行一次,最短路径 其中G为: (Infinit ...
- python常用函数总结
原文地址https://www.cnblogs.com/nice107/p/8118876.html 我们在学习python的时候,接触最多的往往则是那些函数,对于python函数,在这里为大家总结归 ...
- tensorflow变量
tensorflow变量: 1.神经网络中的参数权重,偏置等可以作为张量保存到tensorflow的变量中 2.tensorflow变量必须被初始化 3.可被保存到文件中,下次使用重新加载即可 ten ...
- C# 杀掉Windows中所有Excel进程
Process[] procs = Process.GetProcessesByName("excel"); foreach (Process pro in procs) { pr ...
- 配置jmeter环境变量及运行命令解释
Linux下Jmeter的安装及环境变量的配置 1.将Jmeter的安装包上传至Linux的/opt目录下,解压,如下图: 2.编辑/etc/profile文件配置Jmeter的环境变量 3.将编辑好 ...
- CAN control
2019/4/23--10:14 E_BSW_NWK_TRIGGER_SOURCE_KICK_MOTION_CMD SCI_NwkButton_GetPeriodicSignals case 6: ...
- Docker Kubernetes Volume 本地数据卷
Docker Kubernetes Volume 本地数据卷 emptyDir 当Pod分配到Node时,首先创建一个空卷,并挂载到Pod中的容器. Pod中的容器可以读取和写入卷中的文件. 当Pod ...