传送门

题解:
O(n3log⁡k)O(n^3 \log k)O(n3logk)的优化应该都会。

然后O(n2)O(n^2)O(n2)用BM求出递推式之后再O(n2log⁡k)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算法)相关推荐

  1. Berlekamp–Massey算法简要介绍

    这是一篇翻译向的文章,笔者整理了一些有关Berlekamp–Massey算法的笔记,还增加了一些自己的理解. 下面列出了笔者写此文时所参考的一些资料: wikipedia fjzzq2002 别人的博 ...

  2. Berlekamp–Massey 算法

    学习博客 学习博客 BM算法用于求解常系数线性递推式. 它可以在 O(n2)O(n^2)O(n2) 的时间复杂度内解决问题. 先打个比赛,一会再更 学习算法看上边的两个学习链接就行,板子可以参考我下边 ...

  3. Berlekamp Massey算法(HDU6172)

    用途:常系数k阶递推式求值 HDU6172 #include <bits/stdc++.h>using namespace std; #define rep(i, a, n) for (l ...

  4. 用Spark学习FP Tree算法和PrefixSpan算法

    在FP Tree算法原理总结和PrefixSpan算法原理总结中,我们对FP Tree和PrefixSpan这两种关联算法的原理做了总结,这里就从实践的角度介绍如何使用这两个算法.由于scikit-l ...

  5. 详解python os.walk 实现 tree

    os.walk & 实现tree 代码Doc 实现tree Directory tree generator 代码Doc Directory tree generator.For each d ...

  6. 【CodeChef-TREEWALK】Walk on Tree(BM算法)(特征多项式)

    传送门 题解: 首先由于求的是恰好KKK次,所以直接矩阵快速幂的做法大家应该都会 我们发现实际上就是求矩阵中一些位置的和. 然后这玩意居然有递推式,而且对于所有位置,这个递推式是相同的! 而且这个递推 ...

  7. 决策树Decision Tree+ID3+C4.5算法实战

    决策树Decision Tree 决策树的三种算法: 举个栗子: 熵entropy的概念: 信息熵越大,不确定性越大.信息熵越小,不确定性越小. 其实就是排列组合之中的概率,概率相乘得到其中一个组合, ...

  8. k-d tree的优化查找算法BBF

    BBF(Best Bin First)是一种改进的k-d树最近邻查询算法.从前两篇标准的k-d树查询过程可以看出其搜索过程中的"回溯"是由"查询路径"来决定的, ...

  9. 【Tree】迷宫生成算法

    参考维基百科http://en.wikipedia.org/wiki/Maze_generation_algorithm 1 深度优先搜索 Start at a particular cell and ...

  10. PAT甲级 1151 LCA in a Binary Tree (30分) LCA算法/C++

    1151 LCA in a Binary Tree (30分) 题目大意:给出一棵树的中序和先序遍历,找到这棵树中U和V最小的共同祖先. Tips: 使用一个unordered_map记录中序遍历的值 ...

最新文章

  1. Effective_STL 学习笔记(四十三) 尽量用算法调用代替手写循环
  2. RHEL6.3配置Apache服务器(4) 基于用户的访问控制
  3. List.addAll方法的入参不能为null
  4. linux系统在硬盘上安装程序,怎么样用硬盘上的镜象文件来安装Linux系统?我都进入安装界面了,但是那个安装程序好像找不到那几个镜象文件,请指点...
  5. C# 读取word2003 并且显示在界面上的方法
  6. Docker网络与资源控制
  7. 20组事后诸葛亮会议总结
  8. ubuntu 14.04安装flash播放器
  9. 《预训练周刊》第24期:Infinite-former:无限记忆变换器、2500万悟道科研基金开始申请...
  10. 夏日悦动“正当红”魅焰红版荣耀畅玩手环A2惊艳开售
  11. java 五角星_如何使用Java做出五角星
  12. Python学习周报
  13. 1 dB压缩点_噪声系数_小信号非线性的数学描述
  14. 织梦dede:memberlist增加会员级别名称
  15. linux磁盘分区题目,Linux练习例题(附答案)
  16. 于typedef的用法总结
  17. 用Arduino制作红外线循迹自动机器人
  18. 消控监控系统 服务器,实验室监控系统设计
  19. iOS7 UUID唯一标识
  20. 如何针对商品抢购活动展示效果做功能测试?

热门文章

  1. php写登录的视频,PHP cookie实现记录用户登陆信息的方法(图文+视频)
  2. wps在任务栏取消显示多个文档的预览
  3. 用 JS 给图片加文字水印或图片水印
  4. 作为应聘者 面试结束时应该问面试官一些什么问题呢
  5. python多条件筛选数据并计数_Numpy | 排序、条件筛选函数、统计函数
  6. pdf文件太大如何压缩变小一点?
  7. 谷歌应用商店开发者注册
  8. 用python的tkinter包设计一个随机点菜器
  9. 企业微信打卡统计员工考勤
  10. [乐意黎原创]JS函数声明、 函数表达式与立即执行函数的理解与执行顺序