codeforces 932E Team Work

codeforces 932E

题目描述

求\(\sum_{i=1}^{n}{(^n_i)i^k}\space mod\space10^9+7\)

思路

本题\(n\)的范围很大\((n\le10^9)\),但\(k\)在可接受的范围内\((k\le5000)\),我们可以尝试从\(k\)入手。

构造\((1+x)^n=\sum_{i=0}^n{(^n_i)x^i}\)

对等式两边求导并同乘\(x\),得

\[ nx(1+x)^{n-1}=\sum_{i=1}^n\big(^n_i\big)ix^i \]

重复操作,得

\[ x\frac{\mathrm{d}}{\mathrm{d}x}(nx(1+x)^{n-1})=\sum_{i=1}^n\big(^n_i\big)i^2x^i \]

我们发现,当操作\(k\)次并代入\(x=1\)时就是我们想要的答案。问题转化为求左式的值。但是我们难以直接得出一个复合函数的导数,因此考虑递推转移:令\(f[a][b][c]\)为\(x^b(1+x)^c\)经过a次操作的导数值,则我们要求的是\(f[k][0][n]\)

对\(x^b(1+x)^c\)进行一次操作,得:

\[ bx^b(1+x)^c+cx^{b+1}(1+x)^{c-1} \]

得到转移\(f[a][b][c]=b\times f[a-1][b][c] + c\times f[a-1][b+1][c-1]\)。这一转移可以用记忆化搜索来实现。

代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int MAXK = 5000 + 10;
const int MOD = 1000000007;

ll f[MAXK][MAXK];

ll qpow(ll a, ll b)
{
    ll ans = 1;
    while (b) {
        if (b & 1)
            ans = ans * a % MOD;
        a = a * a % MOD;
        b >>= 1;
    }
    return ans;
}

ll dp(int a, int b, int c)
{
    if (f[a][b] != -1)
        return f[a][b];
    ll& now = f[a][b];
    now = 0;
    if (a == 0)
        return now = qpow(2, c);
    if (c == 0)
        return now = qpow(a, b);
    return now = (b * dp(a - 1, b, c) + c * dp(a - 1, b + 1, c - 1)) % MOD;
}

int main()
{
    ll n, k;
    cin >> n >> k;
    memset(f, -1, sizeof(f));
    cout << dp(k, 0, n);
}

原文地址:https://www.cnblogs.com/erro/p/9037658.html

时间: 2024-11-08 21:28:40

codeforces 932E Team Work的相关文章

Codeforces 932E Team Work 数学

Team Work 发现网上没有我这种写法.. i ^ k我们可以理解为对于每个子集我们k个for套在一起数有多少个. 那么我们问题就变成了 任意可重复位置的k个物品属于多少个子集. 然后我们枚举k个物品所占位置的个数 i , 然后需要计算有多少种方案能把k个不同物品放入i个桶中. 这个东西可以用dp[ i ][ j ] 表示 i 个物品放入 j 个桶中的方案数. dp[ i ][ j ] = dp[ i - 1 ][ j ] * j + dp[ i - 1 ][ j - 1 ] * j 然后就

codeforces 757F Team Rocket Rises Again

链接:http://codeforces.com/problemset/problem/757/F 正解:灭绝树. mdzz倍增lca的根节点深度必须是1..我因为这个错误调了好久. 我们考虑先求最短路,求完最短路以后,我们就能对原来的无向图构造一个DAG.当我们构造完DAG以后,我们要求的东西已经很明显.那就是删掉一个点以后,最多有多少个点与S不连通.那么,我们按照套路,将DAG跑一遍拓扑排序,建出灭绝树.然后求出除了S点以外的最大size就行了. 1 //It is made by wfj_

CodeForces - 401C Team(简单构造)

题意:要求构造一个字符串,要求不能有连续的两个0在一起,也不能有连续的三个1在一起. 分析: 1.假设有4个0,最多能构造的长度为11011011011011,即10个1,因此若m > (n + 1) * 2则肯定不能构造成功. 2.假设有4个0,则至少有3个1,若小于3个,则会有两个连续的0在一起,所以n > m + 1则肯定不能构造成功. 3.当n==m+1时,一定是01串. 4.当m>=n时,应以1为开头构造,根据m和n的个数决定放1个1还是2个连续的1. #include<

CodeForces 490A Team Olympiad

题意: 编号为1.2.3的同学分成一组  问  最多形成多少组  并输出方案 思路: 模拟3个栈暴力 代码: #include<cstdio> #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<map> #include<set> #include<vector> #include<queu

CodeForces 1316E Team Building

Description 你需要组建一支排球队.为了组织一支排球队,你需要为队伍里的 $p$ 个不同的位置,从 $n$ 个人中选出 $p$ 个人,且每个位置上都恰好有一个人.另外还需要从剩下的人中选出恰好 $k$ 个人作为观众. 对于第 $i$ 个人,已知他作为观众时能为队伍增加 $a_i$ 点力量,还有他在队伍的第 $j$ 个位置上时能为队伍增加 $s_{i,j}$ 点力量. 请问这只排球队力量的最大值是多少? Solution 看到 $p$ 很小,考虑状态压缩 DP. 这里先把每个人按照 $a

学习总结:斯特林数( Stirling number )

基本定义 第一类斯特林数:$1 \dots n$的排列中恰好有$k$个环的个数:或是,$n$元置换可分解为$k$个独立的轮换的个数.记作 $$ \begin{bmatrix} n \\ k \end{bmatrix}. $$ 第二类斯特林数:将$n$个元素分成$k$个非空集合的方案数.记作 $$ \begin{Bmatrix} n \\ k \end{Bmatrix}. $$ 根据定义,我们有 $$ \sum_{k=0}^n \begin{bmatrix} n \\ k \end{bmatrix

Codeforces Round #486 (Div. 3) A. Diverse Team

Codeforces Round #486 (Div. 3) A. Diverse Team 题目连接: http://codeforces.com/contest/988/problem/A Description There are n students in a school class, the rating of the i-th student on Codehorses is ai. You have to form a team consisting of k students

Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)

Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) https://codeforces.com/contest/1064 A 1 #include<bits/stdc++.h> 2 #define pb push_back 3 using namespace std; 4 5 bool Check(int a,int b,int c){ 6 if(a+b>c&&b+c>a&&a+c>

Codeforces Team Olympiad(暴力)

***********************************************声明****************************************************** 原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 由于各种原因,可能存在诸多不足,欢迎斧正! *******************************************