传送门

解题思路

  比较有意思的一道数学题。首先\(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. SQl 分组后按照某一列拼接字符串

    /* 分组之后拼接字符串 */ ;with t as( SELECT WorkflowId,Remark FROM dbo.OperatorAutomationProcess GROUP BY Wor ...

  2. BAT批处理知识 及 常用批处理

    1.常用DOS命令:https://blog.csdn.net/qq_38676810/article/details/79584531  或  https://www.jb51.net/articl ...

  3. Python 内置模块:os模块

    Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台.如果是windo ...

  4. WebBug靶场介绍篇 — 01

    今天是星期天,干点啥,反正一天没事,我也不想继续去搞 msf 的那些什么浏览器提权啊,PDF 提权啊,快捷方式提取啊,或者木马免杀什么的,毕竟现在我也不是为了去找工作而去学那些工具了,,, 说开这个靶 ...

  5. H. GSS and Simple Math Problem--“今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛)

    题目描述:链接点此 这套题的github地址(里面包含了数据,题解,现场排名):点此 题目描述 Given n positive integers , your task is to calculat ...

  6. 在Windows Server2016中安装SQL Server2016(转)

    在Windows Server2016中安装SQL Server2016(转) 转自: http://blog.csdn.net/yenange/article/details/52980135 参考 ...

  7. XSS漏洞的渗透利用另类玩法

    XSS漏洞的渗透利用另类玩法 2017-08-08 18:20程序设计/微软/手机 作者:色豹 i春秋社区 今天就来讲一下大家都熟悉的 xss漏洞的渗透利用.相信大家对xss已经很熟悉了,但是很多安全 ...

  8. Template within template: why “`>>' should be `> >' within a nested template argument list” 解决方法

    如果直接这样写: std::vector<boost::shared_ptr<int>> intvec; gcc编译器会把">>"当成opera ...

  9. c#委托(Delegates)--基本概念及使用 转发

    在我这菜鸟理解上,委托就是可以用方法名调用另一方法的便捷方法,可以简化switch等语句的重复.最近做项目的时候恰好需要用到委托,便来复习及学习委托的使用.嗯...本人以前并没有用过,只是稍微知道而已 ...

  10. POJ 3130 How I Mathematician Wonder What You Are! (半平面交)

    题目链接:POJ 3130 Problem Description After counting so many stars in the sky in his childhood, Isaac, n ...