Codechef:Walk on Tree/TREEWALK(Berlekamp-Massey算法)
传送门
题解:
O(n3logk)O(n^3 \log k)O(n3logk)的优化应该都会。
然后O(n2)O(n^2)O(n2)用BM求出递推式之后再O(n2logk)O(n^2 \log k)O(n2logk)用特征多项式优化一下就行了。
这里说一下这个为啥有递推式,我们要求S(Ak)S(A^k)S(Ak),SSS表示对其某些位置求和,由特征多项式是零化多项式可以知道S(Ak)=S(Ak%Z)S(A^k) = S(A^k \% Z)S(Ak)=S(Ak%Z),Z为特征多项式,那么S(Ak+1%Z)=S(Ak%Z∗A)S(A^{k+1}\%Z) = S(A^k \% Z *A)S(Ak+1%Z)=S(Ak%Z∗A),相当于整体往后挪了一位。
#include <bits/stdc++.h>
using namespace std;const int RLEN=1<<18|1;
inline char nc() {static char ibuf[RLEN],*ib,*ob;(ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));return (ib==ob) ? -1 : *ib++;
}
inline int rd() {char ch=nc(); int i=0,f=1;while(!isdigit(ch)) {if(ch=='-')f=-1; ch=nc();}while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();}return i*f;
}const int mod=998244353;
inline int add(int x,int y) {return (x+y>=mod) ? (x+y-mod) : (x+y);}
inline int dec(int x,int y) {return (x-y<0) ? (x-y+mod) : (x-y);}
inline int mul(int x,int y) {return (long long)x*y%mod;}
inline int power(int a,int b,int rs=1) {for(;b;b>>=1,a=mul(a,a)) if(b&1) rs=mul(rs,a); return rs;}const int N=3e3+50, M=6e3+50;
int n,r,k,dp[N][M];
vector <int> g[N];
vector <int> coef;struct poly {vector <int> a;poly(int d=0,int t=0) {a.resize(d+1); a[d]=t;}inline int& operator [](const int &b) {return a[b];}inline const int& operator [](const int &b) const {return a[b];}inline int deg() const {return a.size()-1;}friend inline poly operator *(const poly &a,const poly &b) {poly c(a.deg()+b.deg(),0);for(int i=0;i<=a.deg();i++)for(int j=0;j<=b.deg();j++)c[i+j]=add(c[i+j],mul(a[i],b[j]));return c;}friend inline poly operator +(const poly &a,const poly &b) {poly c(max(a.deg(),b.deg()));for(int i=0;i<=a.deg();i++) c[i]=add(c[i],a[i]);for(int i=0;i<=b.deg();i++) c[i]=add(c[i],b[i]);return c;}inline void opt() {int d=coef.size()-1;for(int i=deg();i>=d;i--) if(a[i])for(int j=1;j<=d;j++)a[i-j]=add(a[i-j],mul(a[i],coef[j]));a.resize(d);}
};
namespace bm {int L,cnt;int a[M],fail[M],delta[M];poly R[M];inline void pt(poly &vec) {for(int i=0;i<=vec.deg();i++) cerr<<vec[i]<<' '; cerr<<'\n';}inline vector <int> solve() {for(int i=1;i<=L;i++) {int d=a[i];if(cnt) for(int j=1;j<=R[cnt].deg();++j) d=dec(d,mul(R[cnt][j],a[i-j]));if(!d) continue;fail[cnt]=i; delta[cnt]=d;if(!cnt) {++cnt;R[cnt]=poly(i,0);} else {int coef=mul(delta[cnt],power(delta[cnt-1],mod-2));for(int j=fail[cnt-1]+1;j<i;j++) R[cnt+1].a.push_back(0);R[cnt+1].a.push_back(coef); for(int j=1;j<=R[cnt-1].deg();j++) R[cnt+1].a.push_back(mul(mod-coef,R[cnt-1][j]));R[cnt+1]=R[cnt+1]+R[cnt]; ++cnt; }} return R[cnt].a;}
}int main() {n=rd(), bm::L=n*2+15;for(int i=1;i<n;i++) {int x=rd(), y=rd();g[x].push_back(y); g[y].push_back(x);} r=rd(), k=rd();dp[r][0]=1;for(int i=1;i<=bm::L;i++)for(int j=1;j<=n;j++)for(auto v:g[j])dp[v][i]=add(dp[v][i],dp[j][i-1]);for(int i=1;i<=bm::L;i++)bm::a[i]=dp[r][i-1];coef=bm::solve();poly f(0,1), g(1,1);for(;k;k>>=1,g=g*g,g.opt())if(k&1) f=f*g,f.opt();for(int i=1;i<=n;i++) {int ans=0;for(int j=0;j<=f.deg();j++)ans=add(ans,mul(f[j],dp[i][j]));cout<<ans<<' ';}
}
Codechef:Walk on Tree/TREEWALK(Berlekamp-Massey算法)相关推荐
- Berlekamp–Massey算法简要介绍
这是一篇翻译向的文章,笔者整理了一些有关Berlekamp–Massey算法的笔记,还增加了一些自己的理解. 下面列出了笔者写此文时所参考的一些资料: wikipedia fjzzq2002 别人的博 ...
- Berlekamp–Massey 算法
学习博客 学习博客 BM算法用于求解常系数线性递推式. 它可以在 O(n2)O(n^2)O(n2) 的时间复杂度内解决问题. 先打个比赛,一会再更 学习算法看上边的两个学习链接就行,板子可以参考我下边 ...
- Berlekamp Massey算法(HDU6172)
用途:常系数k阶递推式求值 HDU6172 #include <bits/stdc++.h>using namespace std; #define rep(i, a, n) for (l ...
- 用Spark学习FP Tree算法和PrefixSpan算法
在FP Tree算法原理总结和PrefixSpan算法原理总结中,我们对FP Tree和PrefixSpan这两种关联算法的原理做了总结,这里就从实践的角度介绍如何使用这两个算法.由于scikit-l ...
- 详解python os.walk 实现 tree
os.walk & 实现tree 代码Doc 实现tree Directory tree generator 代码Doc Directory tree generator.For each d ...
- 【CodeChef-TREEWALK】Walk on Tree(BM算法)(特征多项式)
传送门 题解: 首先由于求的是恰好KKK次,所以直接矩阵快速幂的做法大家应该都会 我们发现实际上就是求矩阵中一些位置的和. 然后这玩意居然有递推式,而且对于所有位置,这个递推式是相同的! 而且这个递推 ...
- 决策树Decision Tree+ID3+C4.5算法实战
决策树Decision Tree 决策树的三种算法: 举个栗子: 熵entropy的概念: 信息熵越大,不确定性越大.信息熵越小,不确定性越小. 其实就是排列组合之中的概率,概率相乘得到其中一个组合, ...
- k-d tree的优化查找算法BBF
BBF(Best Bin First)是一种改进的k-d树最近邻查询算法.从前两篇标准的k-d树查询过程可以看出其搜索过程中的"回溯"是由"查询路径"来决定的, ...
- 【Tree】迷宫生成算法
参考维基百科http://en.wikipedia.org/wiki/Maze_generation_algorithm 1 深度优先搜索 Start at a particular cell and ...
- PAT甲级 1151 LCA in a Binary Tree (30分) LCA算法/C++
1151 LCA in a Binary Tree (30分) 题目大意:给出一棵树的中序和先序遍历,找到这棵树中U和V最小的共同祖先. Tips: 使用一个unordered_map记录中序遍历的值 ...
最新文章
- Effective_STL 学习笔记(四十三) 尽量用算法调用代替手写循环
- RHEL6.3配置Apache服务器(4) 基于用户的访问控制
- List.addAll方法的入参不能为null
- linux系统在硬盘上安装程序,怎么样用硬盘上的镜象文件来安装Linux系统?我都进入安装界面了,但是那个安装程序好像找不到那几个镜象文件,请指点...
- C# 读取word2003 并且显示在界面上的方法
- Docker网络与资源控制
- 20组事后诸葛亮会议总结
- ubuntu 14.04安装flash播放器
- 《预训练周刊》第24期:Infinite-former:无限记忆变换器、2500万悟道科研基金开始申请...
- 夏日悦动“正当红”魅焰红版荣耀畅玩手环A2惊艳开售
- java 五角星_如何使用Java做出五角星
- Python学习周报
- 1 dB压缩点_噪声系数_小信号非线性的数学描述
- 织梦dede:memberlist增加会员级别名称
- linux磁盘分区题目,Linux练习例题(附答案)
- 于typedef的用法总结
- 用Arduino制作红外线循迹自动机器人
- 消控监控系统 服务器,实验室监控系统设计
- iOS7 UUID唯一标识
- 如何针对商品抢购活动展示效果做功能测试?