传送门

解题思路

  比较有意思的一道数学题。首先\(n*k^2\)的做法比较好想,就是维护一个\(x^i\)这种东西,然后转移的时候用二项式定理拆开转移。然后有一个比较有意思的结论就是把求\(x^i\)这种东西变成组合数去求,具体来说就是\(n^k=\sum\limits_{i=1}^k\dbinom{n}{i}*S[k][i]*i!\),\(S\)表示第二类斯特林数,第二类斯特林数可以表示为有\(n\)个盒子要装\(m\)个小球,然后在给盒子和求加上编号就可以得出上面的式子。这样的话在根据帕斯卡三角,每个组合数只会被两个组合数递推出来,所以就能\(O(nk)\)的维护了。参考了这位大佬的博客:https://blog.csdn.net/Mys_C_K/article/details/79942486?utm_source=blogxgwz3

代码

#include<iostream>
#include<cstdio>
#include<cstring> using namespace std;
const int MAXN = 50005;
const int MOD = 10007;
typedef long long LL; inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
} int n,head[MAXN],cnt,to[MAXN<<1],nxt[MAXN<<1],ans[MAXN];
int s[155][155],k,fac[MAXN],f[MAXN][155],g[MAXN][155]; inline void add(int bg,int ed){
to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt;
} inline int calc(int x,int y,int k){
return (g[x][k]-f[y][k]-(k>0?f[y][k-1]:0)+2*MOD)%MOD;
} void prework(){
fac[1]=1;s[0][0]=1;
for(int i=2;i<=k;i++) fac[i]=fac[i-1]*i%MOD;
for(int i=1;i<=k;i++)
for(int j=1;j<=i;j++)
(s[i][j]=s[i-1][j-1]+j*s[i-1][j]%MOD)%=MOD;
} void dfs1(int x,int fa){
f[x][0]=1;int u;
for(int i=head[x];i;i=nxt[i]){
u=to[i];if(u==fa) continue;dfs1(u,x);f[x][0]+=f[u][0];f[x][0]%=MOD;
for(int j=1;j<=k;j++)
f[x][j]+=f[u][j]+f[u][j-1],f[x][j]=f[x][j]>=MOD?f[x][j]-MOD:f[x][j];
}
} void dfs2(int x,int fa){
for(int i=0;i<=k;i++) g[x][i]+=f[x][i],g[x][i]%=MOD;
int u;
for(int i=head[x];i;i=nxt[i]){
u=to[i];if(u==fa) continue;
g[u][0]=g[x][0]-f[u][0];
for(int i=1;i<=k;i++)
g[u][i]=calc(x,u,i)+calc(x,u,i-1),g[u][i]%=MOD;
dfs2(u,x);
}
} int main(){
int now,A,B,Q,L,tmp,x,y;
n=rd(),k=rd(),L=rd(),now=rd(),A=rd(),B=rd(),Q=rd();
for (int i=1;i<n;i++) {
now=(now*A+B)%Q;
tmp=i<L?i:L;x=i-now%tmp,y=i+1;
add(x,y),add(y,x);
}
prework();dfs1(1,0);dfs2(1,0);
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
ans[i]=(ans[i]+(LL)fac[j]*g[i][j]%MOD*s[k][j]%MOD)%MOD;
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
return 0;
}

BZOJ 2159: Crash 的文明世界(组合数学+第二类斯特林数+树形dp)的更多相关文章

  1. P4827 [国家集训队] Crash 的文明世界(第二类斯特林数+树形dp)

    传送门 对于点\(u\),所求为\[\sum_{i=1}^ndis(i,u)^k\] 把后面那堆东西化成第二类斯特林数,有\[\sum_{i=1}^n\sum_{j=0}^kS(k,j)\times ...

  2. BZOJ2159 Crash 的文明世界 【第二类斯特林数 + 树形dp】

    题目链接 BZOJ2159 题解 显然不能直接做点分之类的,观察式子中存在式子\(n^k\) 可以考虑到 \[n^k = \sum\limits_{i = 0} \begin{Bmatrix} k \ ...

  3. 【BZOJ2159】Crash的文明世界(第二类斯特林数,动态规划)

    [BZOJ2159]Crash的文明世界(第二类斯特林数,动态规划) 题面 BZOJ 洛谷 题解 看到\(k\)次方的式子就可以往二项式的展开上面考,但是显然这样子的复杂度会有一个\(O(k^2)\) ...

  4. 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4827 ​ 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...

  5. bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 学习材料:https://blog.csdn.net/litble/article/d ...

  6. bzoj 2159 Crash 的文明世界 & hdu 4625 JZPTREE —— 第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 使用公式:\( n^{k} = \sum\limits_{i=0}^{k} S(k,i ...

  7. BZOJ 2159: Crash 的文明世界 第二类斯特林数+树形dp

    这个题非常巧妙啊~ #include <bits/stdc++.h> #define M 170 #define N 50003 #define mod 10007 #define LL ...

  8. bzoj 2159: Crash 的文明世界

    Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 480  Solved: 234[Submit][Status][Discuss] Descripti ...

  9. BZOJ.2159.Crash的文明世界(斯特林数 树形DP)

    BZOJ 洛谷 挺套路但并不难的一道题 \(Description\) 给定一棵\(n\)个点的树和\(K\),边权为\(1\).对于每个点\(x\),求\(S(x)=\sum_{i=1}^ndis( ...

随机推荐

  1. leetcode-160周赛-5241-铺瓷砖

    题目描述: 方法一:动态规划 class Solution: def f(self, n, m): if n < m: n, m = m, n if (n, m) in self.mem: re ...

  2. 【转】Spring+Websocket实现消息的推送

    本文主要有三个步骤 1.用户登录后建立websocket连接,默认选择websocket连接,如果浏览器不支持,则使用sockjs进行模拟连接 2.建立连接后,服务端返回该用户的未读消息 3.服务端进 ...

  3. SQL 与,或,非

    SQL AND, OR and NOT(与,或不是运算符) AND&OR运算符用于根据一个以上的条件过滤记录. SQL AND & OR 运算符 WHERE子句可以与AND,OR和NO ...

  4. Java-Class-E:org.springframework.http.HttpStatus

    ylbtech-Java-Class-E:org.springframework.http.HttpStatus 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部 1. /* * C ...

  5. Devstack 配置文件说明手册

    本文为minxihou的翻译文章,转载请注明出处Bob Hou: http://blog.csdn.net/minxihou JmilkFan:minxihou的技术博文方向是 算法&Open ...

  6. JAVA学习之跨平台性

    Java语音的特点:跨平台性什么是跨平台性通过Java语音编写的应用程序再不同的系统平台上都可以运行. 原理是什么只要在需要运行Java应用程序的操作系统上.先安装一个Java虚拟机(JVM Java ...

  7. CentOS 7 启用中文输入法

    $HOME/.xinitrc LANG="zh_CN.UTF-8" exec startxfce4

  8. JUC源码分析-集合篇(十)LinkedTransferQueue

    JUC源码分析-集合篇(十)LinkedTransferQueue LinkedTransferQueue(LTQ) 相比 BlockingQueue 更进一步,生产者会一直阻塞直到所添加到队列的元素 ...

  9. python调用tushare获取A股上市公司基础信息

    接口:stock_company 描述:获取上市公司基础信息 积分:用户需要至少120积分才可以调取,具体请参阅最下方积分获取办法 注:tushare库下载和初始化教程,请查阅我之前的文章 输入参数 ...

  10. Use on Git

    Preface            The document is about to introduce some specialties on PLM development and mainte ...