spoj235 Very Fast Multiplication
水水的fft啦.主要是来mark一下数论版fft. 有一个奇妙的东西叫原根.这个玩意要乘(p-1)次才能乘回自己.然后如果(p-1)含有很多很多个2的话,就可以拿来做fft辣.其实就是解决了fft的单位根,不用complex.剩下的照搬好辣. 水ovo.在这个前不着村后不着店的四星酒店里好无语ovo
水水的fft啦.主要是来mark一下数论版fft. 有一个奇妙的东西叫原根.这个玩意要乘(p-1)次才能乘回自己.然后如果(p-1)含有很多很多个2的话,就可以拿来做fft辣.其实就是解决了fft的单位根,不用complex.剩下的照搬好辣. 水ovo.在这个前不着村后不着店的四星酒店里好无语ovo
原来备案还没过。那之前是怎么成功访问的囧。 写了一晚上。教训还是之前那个,写之前要想清楚。写完再去改就很烦。自己yy了很久,虽然最初是听了mhy的一句提醒。好有危机感。 首先这个东西可以离线。之前一直在想在线怎么做然后也觉得没法做。 把询问按右端点排序之后问题就转化成了左端点在一个范围里的时候的最大子段。 然后用一个线段树表示从i到current right的时候的和,这个玩意可以直接区间加。然后再去维护这个东西的历史最大值。于是就变成了每个位置上接了一个add序列,要找它的前缀最大值。那么只需要存两个东西:当前的和以及当前的最大前缀和,就可以合并了。 然后线段树上维护两个add序列,分别是对整个线段的lazy tag of add和max value of son。就可写了。 然后好像跑得很慢啊TT。
<div class="post_brief"><p> 什么鬼。</p> 很好想的dp。f[i][j]表示深度不超过i且大小为j的二叉树的个数。转移是f[i][j] = ∑(f[i - 1][k] * f[i - 1][j - k - 1])。 然后直接暴力是O(n3)的。在spoj上能过在bzoj上不能过。在bzoj上得用记忆化搜索来减掉一些无用的东西。虽然我觉得很烦。 然后试图用fft,发现fft比暴力还慢。然后试图用fnt,然后发现fnt好像不能对1e9+7这种质数用。因为1e9+6只有来一个2。真悲伤。我还是太弱啊。 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn = 609; const int mod = 1000000007; #define _l (long long int) int f[maxn][maxn]; int getf(int i, int j) { if (i == 0) return j <= 1; else if (j == 0) return 1; else if (f[i][j] == -1) { f[i][j] = 0; for (int k = 0; k < j; ++ k) f[i][j] = (f[i][j] + _l getf(i - 1, k) * getf(i - 1, j - k - 1)) % mod; } return f[i][j]; }...
看上去挺水水水水水水水水的一道平衡树维护序列的数据结构题啊。 先用split-merge tree写,tle。 然后改用splay,tle。 最后据说把splay的裸数组改到struct node里就能过。于是再写了一个程序来改代码。 不 带 这 么 坑 的 ! #include <cstdio> #include <cstdlib> #include <cctype> #include <memory.h> #include <algorithm> using namespace std; /*#define readInt(_s_) {\ int _d_;\ bool _nag_ = 0;\ _s_ = 0;\ while (!isdigit(_d_ = getchar()))\ if (_d_ == '-')\ _nag_ = 1;\ while ((_s_ = _s_ * 10 + _d_ - 48), isdigit(_d_ = getchar()));\ if (_nag_)\ _s_ = - _s_;\ }*/ #define readInt(_s_) scanf("%d",&_s_); #define readOpt(_s_) {\ do\ _s_ = getchar();\ while (_s_ != 'I' && _s_ != 'D' && _s_ !...