洛谷 P6031 - CF1278F Cards 加强版(推式子+递推)
u1s1 这个推式子其实挺套路的吧,可惜有一步没推出来看了题解
res&=\sum\limits_{i=0}^ni^k\dbinom{n}{i}(\dfrac{1}{m})^i(\dfrac{m-1}{m})^{n-i}\\
&=\sum\limits_{i=0}^n\sum\limits_{j=1}^k\begin{Bmatrix}k\\j\end{Bmatrix}i^{\underline{j}}\dbinom{n}{i}(\dfrac{1}{m})^i(\dfrac{m-1}{m})^{n-i}\\
&=(\dfrac{m-1}{m})^{n}\sum\limits_{i=0}^n\sum\limits_{j=1}^k\begin{Bmatrix}k\\j\end{Bmatrix}i^{\underline{j}}\dbinom{n}{i}(\dfrac{1}{m-1})^i\\
&=(\dfrac{m-1}{m})^{n}\sum\limits_{i=0}^n\sum\limits_{j=1}^k\begin{Bmatrix}k\\j\end{Bmatrix}i^{\underline{j}}\dbinom{n}{i}(\dfrac{1}{m-1})^i\\
&=(\dfrac{m-1}{m})^{n}\sum\limits_{j=1}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\sum\limits_{i=0}^n\dbinom{i}{j}\dbinom{n}{i}(\dfrac{1}{m-1})^i\\
&=(\dfrac{m-1}{m})^{n}\sum\limits_{j=1}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\dbinom{n}{j}(\dfrac{1}{m-1})^j\sum\limits_{i=0}^{n-j}\dbinom{n-j}{i-j}(\dfrac{1}{m-1})^i\\
&=(\dfrac{m-1}{m})^{n}\sum\limits_{j=1}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\dbinom{n}{j}(\dfrac{1}{m-1})^j(\dfrac{m}{m-1})^{n-j}\\
&=\sum\limits_{j=1}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\dbinom{n}{j}(\dfrac{1}{m})^j\\
&=\sum\limits_{j=1}^k\sum\limits_{l=0}^j\dbinom{j}{l}l^k(-1)^{j-l}\dbinom{n}{j}(\dfrac{1}{m})^j\\
&=\sum\limits_{l=0}^jl^k\sum\limits_{j=1}^k\dbinom{j}{l}(-1)^{j-l}\dbinom{n}{j}(\dfrac{1}{m})^j\\
&=\sum\limits_{l=0}^kl^k\dbinom{n}{l}\sum\limits_{j=l}^k(-1)^{j-l}\dbinom{n-l}{j-l}(\dfrac{1}{m})^j\\
\end{aligned}
\]
前面那东西我们要枚举 \(l\),复杂度自然有一个 \(k\),后面那东西看似可以二项式定理,但是由于上界为 \(k\) 而不是 \(n\),实则不能,因此考虑按照套路进行递推,设 \(f_l\) 表示
\]
那么
f_{l-1}&=\sum\limits_{j=l-1}^k(-1)^{j-l+1}\dbinom{n-l+1}{j-l+1}(\dfrac{1}{m})^j\\
&=-\sum\limits_{j=l-1}^k(-1)^{j-l}\dbinom{n-l+1}{j-l+1}(\dfrac{1}{m})^j\\
&=-\sum\limits_{j=l-1}^k(-1)^{j-l}\dbinom{n-l}{j-l+1}(\dfrac{1}{m})^j-\sum\limits_{j=l-1}^k(-1)^{j-l}\dbinom{n-l}{j-l}(\dfrac{1}{m})^j\\
&=-\sum\limits_{j=l}^{k+1}(-1)^{j-1-l}\dbinom{n-l}{j-l}(\dfrac{1}{m})^{j-1}-\sum\limits_{j=l-1}^k(-1)^{j-l}\dbinom{n-l}{j-l}(\dfrac{1}{m})^j\\
&=m\sum\limits_{j=l}^{k+1}(-1)^{j-l}\dbinom{n-l}{j-l}(\dfrac{1}{m})^{j}-\sum\limits_{j=l-1}^k(-1)^{j-l}\dbinom{n-l}{j-l}(\dfrac{1}{m})^j\\
&=m(\sum\limits_{j=l}^{k}(-1)^{j-l}\dbinom{n-l}{j-l}(\dfrac{1}{m})^{j}+(-1)^{k+1-l}\dbinom{n-l}{k+1-l}(\dfrac{1}{m})^{k+1})-\sum\limits_{j=l}^k(-1)^{j-l}\dbinom{n-l}{j-l}(\dfrac{1}{m})^j\\
&=m(f_l+(-1)^{k+1-l}\dbinom{n-l}{n-k-1}(\dfrac{1}{m})^{k+1})-f_l
\end{aligned}
\]
从后往前一遍递推即可。\(\text{id}_k\) 可以一遍线筛筛出,复杂度 \(\mathcal O(k)\)
至于我是哪里被卡住了呢……在第一个公式的第七个等于号那边,我上来就想拆开来递推,然后发现递推完了要套好几层,然后就 quit 了。事实证明一般只有只带一个组合数的式子才能递推求解。
那么问题就来了,为什么我的 \(\mathcal O(k)\) 跑不过 \(\mathcal O(k\log k)\)/yun/yun
const int MAXK=1e7+1;
const int MOD=998244353;
int n,m,k;
int qpow(int x,int e){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
return ret;
}
int fac[MAXK+5],ifac[MAXK+5],f[MAXK+5],inv[MAXK+5];
void init_fac(int n){
for(int i=(fac[0]=ifac[0]=inv[0]=inv[1]=1)+1;i<=n;i++) inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%MOD,ifac[i]=1ll*ifac[i-1]*inv[i]%MOD;
}
int pwk[MAXK+5],pr[MAXK/10+5],prcnt=0;
bitset<MAXK+5> vis;
void sieve(int n){
pwk[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]) pwk[i]=qpow(i,k);
for(int j=1;j<=prcnt&&pr[j]*i<=n;j++){
vis[pr[j]*i]=1;pwk[pr[j]*i]=1ll*pwk[pr[j]]*pwk[i]%MOD;
if(i%pr[j]==0) break;
}
}
}
int main(){
init_fac(MAXK);int res=0;
scanf("%d%d%d",&n,&m,&k);sieve(k+1);
int ivm=qpow(m,MOD-2),pw=qpow(ivm,k+1);
for(int l=k+1,cur=1;l>=2;l--){
int t=1ll*cur*pw%MOD;
// printf("%d\n",cur);
if((k+1-l)&1) f[l-1]=(1ll*m*(f[l]-t+MOD)%MOD-f[l]+MOD)%MOD;
else f[l-1]=(1ll*m*(f[l]+t)%MOD-f[l]+MOD)%MOD;
cur=1ll*cur*(n-l+1+MOD)%MOD*inv[k+2-l]%MOD;
}
for(int l=1,cur=n;l<=k;l++){
res=(res+1ll*f[l]*pwk[l]%MOD*cur)%MOD;
cur=1ll*cur*(n-l)%MOD*inv[l+1]%MOD;
} printf("%d\n",res);
return 0;
}
洛谷 P6031 - CF1278F Cards 加强版(推式子+递推)的更多相关文章
- 洛谷4316 绿豆蛙的归宿(DAG递推/概率dp)
题目大意: 给定一个DAG,求起点到终点的路径长度期望 根据题意可以知道每一条边都有一定概率被走到 那么\(\displaystyle\begin{aligned} Ans = \sum_{e \in ...
- 【洛谷】P1095 守望者的逃离(递推)
题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会 ...
- [codevs1048]石子归并&[codevs2102][洛谷P1880]石子归并加强版
codevs1048: 题目大意:有n堆石子排成一列,每次可合并相邻两堆,代价为两堆的重量之和,求把他们合并成一堆的最小代价. 解题思路:经典区间dp.设$f[i][j]$表示合并i~j的石子需要的最 ...
- 洛谷 P1446 [HNOI2008]Cards 解题报告
P1446 [HNOI2008]Cards 题目描述 小春现在很清闲,面对书桌上的\(N\)张牌,他决定给每张染色,目前小春只有\(3\)种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun ...
- 洛谷——P2082 区间覆盖(加强版)
P2082 区间覆盖(加强版) 题目描述 已知有N个区间,每个区间的范围是[si,ti],请求出区间覆盖后的总长. 输入输出格式 输入格式: N s1 t1 s2 t2 …… sn tn 输出格式: ...
- 洛谷P1446 [HNOI2008]Cards
置换群+dp #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring& ...
- 洛谷 - P4449 - 于神之怒加强版 - 莫比乌斯反演
https://www.luogu.org/problemnew/show/P4449 \(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{m} gcd(i, ...
- 洛谷P2082 区间覆盖(加强版)(珂朵莉树)
传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include< ...
- 洛谷P1446/BZOJ1004 Cards Burnside引理+01背包
题意:有n张牌,有R+G+B=n的3种颜色及其数量,要求用这三种颜色去染n张牌.n张牌有m中洗牌方式,问在不同洗牌方式下本质相同的染色方案数. 解法:这道题非常有意思,题解参考Hzwer学长的.我这里 ...
随机推荐
- 学了ES6,还不会Promise的链式调用?🧐
前言 本文主要讲解promise的链式调用的方法及其最终方案 应用场景 假如开发有个需求是先要请求到第一个数据,然后根据第一个数据再去请求第二个数据,再根据第二个数据去请求第三个数据...一直到最后得 ...
- 华为HG255D挂卡中继专用旋风科技固件
正的挂卡不掉线不掉速,稳定上网看上去好像很NB的样子 挂卡设置教程:http://picimg.lshou.com/pic/clou ... /6/t/1/30247515.mp4 固件链接: htt ...
- 该如何有效的提高C/C++语言编程能力
很多答案都谈到算法的重要性,我的答案主要集中在C++上,只是一些个人经验. 其实我以前也有这样的困惑,感觉完了不知道怎么用.而且我也不是学计算机的,也没有从事相关工作,所以大概有十年的时间都没写什么程 ...
- IPv6(诞生原因、数据报格式、与IPv4的不同、地址表现形式、基本地址类型、IPv6与IPv4的过渡策略)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105297642 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 『学了就忘』Linux基础 — 6、VMware虚拟机安装Linux系统(超详细)
目录 1.打开VMware虚拟机软件 2.选择Linux系统的ISO安装镜像 3.开启虚拟机安装系统 (1)进入Linux系统安装界面 (2)硬件检测 (3)检测光盘 (4)欢迎界面 (5)选择语言 ...
- linux下文件特殊权限设置位S和沾附位T(转载)
今天在创建文件的时候,发现了文件权限末尾有个T,之前没留意过,后来又用c创建(open)了两个文件来查看,在我没有指定权限(省略open的第三个参数)的时候,有时还会出现S,虽然还没弄懂什么时候会出现 ...
- switch中case...用法-c语言
... 表示范围 case 0...4; // error case 5 ... 9; // ok eg 1: char ch = 4; switch(ch) { case 1: printf(& ...
- hdu 1502 Regular Words(DP)
题意: 一个单词X由{A,B,C}三种字母构成. A(X):单词X中A的个数.B(X),C(X)同理. 一个单词X如果是regular word必须满足A(X)=B(X)=C(X)且对于X的任意前缀有 ...
- JAVA笔记10__Math类、Random类、Arrays类/日期操作类/对象比较器/对象的克隆/二叉树
/** * Math类.Random类.Arrays类:具体查JAVA手册...... */ public class Main { public static void main(String[] ...
- hdu 2176 取(m堆)石子游戏 (裸Nim)
题意: m堆石头,每堆石头个数:a[1]....a[m]. 每次只能在一堆里取,至少取一个. 最后没石子取者负. 先取者负输出NO,先取胜胜输出YES,然后输出先取者第1次取子的所有方法.如果从有a个 ...