codeforces 932E Team Work(组合数学、dp)
codeforces 932E Team Work
题意
给定 \(n(1e9)\)、\(k(5000)\)。求 \(\Sigma_{x=1}^{n}C_n^xx^k\)。
题解
解法一
官方题解 的做法,网上有很多,就不写了。
解法二
从组合数学的角度入手。
参考博客
我们可以这样理解这个式子 \(\Sigma_{x=1}^{n}C_n^xx^k\) :有 \(n\) 种小球,从中选出 \(x\) 种,再选出 \(k\) 个小球,这 \(k\) 个小球只能来自选定的 \(x\) 种类别。求方案数。
如果我们用 \(f[i][j]\) 表示 \(i\) 个小球刚好来自某 \(j\) 个种类的方案数。那么 \(\Sigma_{x=1}^{n}C_n^xx^k \equiv \Sigma_{i=1}^{min(n, k)}f_{k,i}*2^{n-i}\) 。
\(f_{k,i}*2^{n-i}\) 可以这样理解:对于选出的某 \(k\) 个小球,有多少种选出小球种数的方案。
\(f_{i,j}\) 的转移如下:\(f_{i,j}=j*f_{i-1,j}+(n-(j-1))*f_{i-1,j-1}\)
//
今天看到一个理解(k=2时)
假设一个公司n个人,挑x个人出来进行抽奖,抽两次奖的方案数就是\(\Sigma_{x=1}^{n}C_n^xx^2\)
从另一个角度枚举所有方案数:只有一个人中奖:\(n2^{n-1}\) 有两个人中奖:\(n(n-1)2^{n-2}\)
解法三
官方题解的评论区 laderlappen 的做法
化简给出的式子,得到的新的式子可以用 \(dp\) 求解。
解法四
化简之后,变成一个和斯特林数有关的式子。
解法五
官方题解的评论区 _rqy 和 retrograd 的做法
\(ans(n, k)=2^n*f_k(n)\), \(f_k(n)\) 是一个 \(k\) 阶多项式,可以用拉格朗日插值法求出。
代码
解法一
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(x) (int)x.size()
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int N=5005, mod=1e9+7;
int n,k;
ll f[N][N];
ll upd(ll &a, ll b) {
a+=b;
if(a>=mod) a-=mod;
}
ll kpow(ll a,ll b) {
ll res=1;
while(b) {
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
ll solve(int a, int b, int c) {
if(~f[a][b]) return f[a][b];
if(a==0) return f[a][b]=kpow(2, c);
ll res=0;
if(c) {
upd(res, b*solve(a-1, b, c)%mod);
upd(res, c*solve(a-1, b+1, c-1)%mod);
} else {
res=kpow(b, a);
}
return f[a][b]=res;
}
int main() {
while(~scanf("%d%d",&n,&k)) {
memset(f,-1,sizeof(f));
printf("%lld\n",solve(k, 0, n));
}
return 0;
}
解法二
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(x) (int)x.size()
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int N=5005, mod=1e9+7;
int n,k;
ll f[N][N];
ll upd(ll &a, ll b) {
a+=b;
if(a>=mod) a-=mod;
}
ll kpow(ll a,ll b) {
ll res=1;
while(b) {
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main() {
while(~scanf("%d%d",&n,&k)) {
memset(f,0,sizeof(f));
f[0][0]=1;
rep(i,1,k+1) {
rep(j,1,min(n, k)+1) {
upd(f[i][j], j*f[i-1][j]%mod);
upd(f[i][j], (n-j+1)*f[i-1][j-1]%mod);
}
}
ll ans=0;
rep(i,1,min(n, k)+1) upd(ans, f[k][i]*kpow(2, n-i)%mod);
printf("%lld\n",ans);
}
return 0;
}
codeforces 932E Team Work(组合数学、dp)的更多相关文章
- Codeforces 932E Team work 【组合计数+斯特林数】
Codeforces 932E Team work You have a team of N people. For a particular task, you can pick any non-e ...
- 2018.12.14 codeforces 932E. Team Work(组合数学)
传送门 组合数学套路题. 要求ans=∑i=0nCni∗ik,n≤1e9,k≤5000ans=\sum_{i=0}^n C_n^i*i^k,n\le 1e9,k\le 5000ans=∑i=0nCn ...
- Codeforces 932E Team Work 数学
Team Work 发现网上没有我这种写法.. i ^ k我们可以理解为对于每个子集我们k个for套在一起数有多少个. 那么我们问题就变成了 任意可重复位置的k个物品属于多少个子集. 然后我们枚举k个 ...
- Codeforces 886E Maximum Element 组合数学 + dp
我们定义dp[ i ]表示长度为 i 的序列, 最后没有一个==k的时候返回的方案数, 也就是最后强制返回 i 的方案数. 我们能得到dp方程 dp[ i ] = sum(dp[ i - j - ...
- [Codeforces 932E]Team Work
Description 题库链接 求 \[\sum_{i=1}^n C(n,i)\times i^k\] \(1\leq n\leq 10^9, 1\leq k\leq 5000\) Solution ...
- 【uoj#22】[UR #1]外星人 组合数学+dp
题目描述 给你一个长度为 $n$ 的序列 $\{a_i\}$ 和一个数 $x$ ,对于任意一个 $1\sim n$ 的排列 $\{p_i\}$ ,从 $1$ 到 $n$ 依次执行 $x=x\ \tex ...
- 【bzoj1925】[Sdoi2010]地精部落 组合数学+dp
题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到 ...
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...
- Codeforces - 1081C - Colorful Bricks - 简单dp - 组合数学
https://codeforces.com/problemset/problem/1081/C 这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况. $k=0$ 就是全部同色, $k=1 ...
随机推荐
- 个人作业1——个人阅读&提问题
第一部分:结缘计算机 上大学前接触了一些网游,如魔域.DNF等.偶然间朋友介绍了一些辅助软件,当时非常地好奇这些辅助软件是如何制作出来的,就上百度搜索了一些关键词,然后就了解到了易语言.VB.金山 ...
- 我和ARM的那些事儿3 beep之旅,最详细的ARM裸机工程设置
前言 在博客园里面我搜索了老半天,找相应的mini2440的裸机开发的程序,让我挺失望的就是居然没有人对做arm这块做详细的解答,到底如何去做,到底如何去配置,都不清楚,让我很纠结,那么我花了近一星期 ...
- IOS项目之分层MVVM
在做.Net时,有用到三层架构,使项目分层.ios项目使用AFNetWork把网络层这块也放进了ViewController中,数据解析缓存这些也在里面,这样层次结构可能不够清楚,今天就试着分离了一下 ...
- html锚点使用示例
<html> <body> <h1>HTML 教程目录</h1> <ul> <li><a href="#C1&q ...
- 把IP字符串转换为IPv4标准格式
把IP字符串转换为IPv4标准格式,如一个IP为127.0.0.1转为127.000.000.001格式? 即是说“点”分隔的数据不够三位数字长度,转换为三位数字长度. Insus.NET有尝试写了一 ...
- [SQL Server] 无法连接到本地数据库
打开SQL Server配置管理器 启用下图两个协议 打开SQL Server服务 这一步可能出现这种情况: 故障原因是,安装Visual Studio 2012的时候,自动安装“Microsoft ...
- WCF中的AddressHeader作用
客户端发送请求给服务端,服务端根据请求消息把消息转发给对应的终结点.这里面有个消息筛选机制,如果请求消息中带有地址报头相关信息,则会用地址报头匹配当前的所有终结点.所以默认情况下客户端和服务端的地址报 ...
- Java - 关于泛型
自Java 1.5开始使用的泛型,泛型给人比较直观的印象是..."尖括号里写了类型我就不用检查类型也不用强转了". 确实,那先从API的使用者的角度上想问题,泛型还有什么意义? D ...
- js只允许输入数字和两位小数
一.js只允许输入数字和两位小数 //只允许输入数字和两位小数 function clearNoNum(obj) { obj.value = obj.value.replace(/[^\d.]/g, ...
- SublimeText3 插件的使用和本身的配置
--------------------20180109----------------------- Part1:如何设置代码字体变大变小 1.点击菜单栏 Sublime Text 中prefere ...