首页 > 其他分享 >Codeforces463-E.Team Work-组合数、DP

Codeforces463-E.Team Work-组合数、DP

时间:2023-09-25 11:46:36浏览次数:32  
标签:Codeforces463 int ll Work ret leq sum DP MOD

Codeforces463-E.Team Work

题意:求

\[\sum_{i=1}^n \binom{n}{i} i^k \]

其中\(1\leq n\leq 10^9\),\(1\leq k \leq 5000\)。


题解:

其实这个题\(k\)的数据范围就已经暗示了做法的复杂度——应该是要去考虑根据 \(k\) 去递推了。

首先为了方便,\(i=0\)这一项完全可以补上,用类似生成函数的想法,补上一个\(x\)占位:

\[f_k(x)=\sum_{i=0}^n\binom{n}{i} i^k x^i \]

我们如果知道\(f_k(x)\)的封闭形式,只要代入\(x=1\)就能求了,而\(f_k\)的递推应该是很经典的:

\[xf_k'(x)=\sum_{i=0}^n\binom{n}{i} i^{k+1} x^i=f_{k+1}(x) \]

即\(f_{k+1}(x)=x f'_k(x)\),边界是\(f_0(x)=\sum_{i=0}^n \binom{n}{i} x^i=(x+1)^n\),而递推中的运算只有求导和乘法。

\[x[(x+1)^n]'=n\times x(x+1)^{n-1} \]

设\(f=x^a (x+1)^b\),则

\[xf'=ax^a (x+1)^b +b x^{a+1}(x+1)^{b-1} \]

求导过程中\(a+b\)的值是不变的。

设个dp数组\(g[k][b]\)表示\(f_k(x)\)中\(x^{n-b}(x+1)^b\)的系数是多少,边界是\(g[k][n]=1\),需要推出\(g[0][n-k\dots n]\)的系数,所以只需要从\(g[i][j]\) 转移给\(g[i-1][j]\) 和\(g[i-1][j-1]\),最后的答案就是\(\sum_j g[0][j]\times 2^j\)。

顺便这题应该是要写滚动数组,\(5000^2\)可能MLE。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
const int N=5005;
const int MOD=1e9+7;
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
int ksm(int a,int b){
	int ret=1;
	for(;b;b>>=1,a=(ll)a*a%MOD)if(b&1)ret=(ll)ret*a%MOD;
	return ret;
}
int n,k,g[N][2];
int main(){
	fastio;
	cin>>n>>k;
	int D=n-k-1,st=(k&1),lwb=max(0,n-k);
	g[n-D][st]=1;
	for(int i=k;i>=1;i--){
		int c=(i&1);
		rep(j,lwb,n){
			add(g[j-D][c^1],(ll)(n-j)*g[j-D][c]%MOD);
			if(j)add(g[j-1-D][c^1],(ll)j*g[j-D][c]%MOD);
		}
		rep(j,lwb,n)g[j-D][c]=0;
	}
	int ans=0;
	rep(j,lwb,n)add(ans,(ll)g[j-D][0]*ksm(2,j)%MOD);
	cout<<ans;
	return 0;
}

标签:Codeforces463,int,ll,Work,ret,leq,sum,DP,MOD
From: https://www.cnblogs.com/yoshinow2001/p/17727607.html

相关文章

  • Qt/C++音视频开发56-udp推流和拉流/组播和单播推流
    一、前言之前已经实现了rtsp/rtmp推流,rtsp/rtmp/hls/flv/ws-flv/webrtc等拉流,这种一般都需要依赖一个独立的流媒体服务程序,有没有一种更便捷的方式不需要这种依赖,然后又能实现推拉流呢,当然有的那就是udpp推流,其中udp推流还可以是组播或者单播推流,组播一般会选择224.0.0.1这个地址......
  • 数位dp
    d数位dp#include<iostream>#include<cstring>#include<algorithm>#include<string>#include<cmath>#include<vector>usingnamespacestd;constintN=17;typedeflonglongll;constllINF=1e17;llf[N][10];voi......
  • 如何在 SOLIDWORKS中创建零件模板 硕迪科技
    作为一款多功能且可大量定制的3DCAD软件,SOLIDWORKS模板可以通过自定义属性包含大量数据。可以通过为SOLIDWORKS零件、装配体和工程图创建模板来利用这些模板。与其他一些CAD软件不同,SOLIDWORKS不限制您可以创建的模板数量-您可以根据需要创建任意数量的零件、装配体和工程图模......
  • spring boot错误之-Error (3, 32) java 程序包org springframework boot不存在
    问题:springboot错误之-Error(3,32)java程序包orgspringframeworkboot不存在用IDEA创建springboot,遇到上面的问题(我这里maven用的3.6.1版本)解决方法:在Settings里面,Maven路径和settings.xml要设置正确org.springframework.boot版本更改为2.1.0.RELEASE即可......
  • SOLIDWORKS Simulation:优化设计的利器
    SOLIDWORKSSimulation是SOLIDWORKS软件家族中的一员,是一款强大的工程仿真分析工具。它通过模拟和分析,帮助工程师们更好地理解和评估设计方案的性能,并通过优化设计来提高产品质量和效率。这篇文章我们将介绍SOLIDWORKSSimulation的特点、应用领域以及其在现代工程设计中的重要作用......
  • ## Could not find a working installation of Boost.
     001、问题 002、解决方法(base)[[email protected]]#yum-yinstallboostboost-devel(base)[[email protected]]#yum-yinstallgcc-c++.x86_64gperf 参考:https://code84.com/754823.html ......
  • 什么是外企中经常提到的 ad-hoc work
    Ad-hoc工作:何为、实例分析、重要性与应对策略Ad-hoc工作,这个术语在外企管理领域常常被提及,是一种灵活的、非结构化的工作方式。它通常用来应对突发性的任务、问题或需求,而不是按照预定计划或流程执行的工作。本文将深入探讨Ad-hoc工作的含义、重要性、实际案例以及有效应对策略,以......
  • 状压DP合集
    目录2023百度之星初赛三-1石碑文[ABC318-]2023百度之星初赛三-1石碑文[ABC318-]......
  • [转]Websocket 底层是 TCP 还是 UDP?白话版解析 TCP 和 UDP 传输过程
    原文地址:Websocket底层是TCP还是UDP?白话版解析TCP和UDP传输过程-掘金写在前面在前面陆陆续续写了好几篇数字孪生相关的文章,而其中所涉及的一个其他项目比较不常使用的技术,网络通讯协议Websocket,这个协议主要用于服务器定时向客户端推送数据,相比HTTP更加适合数字......
  • Vmware Workstation 17 开机自启虚拟机
    VMwareWorkstation17中设置虚拟机开机自启动的步骤如下:打开VMwareWorkstation17。在左侧导航栏点击配置自动启动虚拟机。然后选择要自动启动的虚拟机并配置启动顺序,点击确定。设置自动启动服务。打开任务管理器,点击服务,找到VmwareAutostartService,右键,点击开始。找到VMware自......