トピック
https://codeforces.com/contest/932/problem/E
中国語のタイトル:N(1≤N≤1e9)の異なる人々がいて、そこからx(xは少なくとも1)の個人を選択して、xk(1≤k≤5000)のコストでチームタスクを完了します。すべてのチーム計画の総コストを見つけます。
導関数の4つの算術演算について:https://www.cnblogs.com/liming19680104/p/10955536.html
回答
質問要件①を描くのは簡単です。ここで、i = 0は答えに影響しません。
以下を見ると二項定理が思い浮かびます:② 、
①は②と非常によく似ており、②は①よりもはるかに優れています。②を①に変更するにはどうすればよいですか?
答えは:派生を求める
②式の導関数をxで乗算されている場合、X誘導体、繰り返し乗算され、なり、、...、k回は後で再利用となるxが、それは1に等しくするために、我々は、任意に取ら数であるので、。式②の右辺がやっととなりますので、式②の左辺の微分結果を計算するだけで答えが得られます。
②式の左側の変換プロセス:
一度:
このとき、関数 は4つの算術演算の導関数に従って、乗算という2つの関数になり ます。
次の変換を行うことができます。
このようにして 、( この項の係数の)形式の 各項をに変更できます 。
k回の変換を実行し、最大でk個のアイテムを生成し、アイテムの削除はカウントされません。係数と複雑さを維持するには、dpを使用します。
コード
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#define ll long long
#define MAXN 5005
#define MOD 1000000007ll
using namespace std;
inline ll read(){
ll x=0,f=1;char s=getchar();
while((s<'0'||s>'9')&&s>0){if(s=='-')f*=-1;s=getchar();}
while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+s-'0';s=getchar();}
return x*f;
}
int k;
ll n,dp[MAXN],ans;
inline ll ksm(ll a,ll b,ll mo){
ll res=1;
for(;b;b>>=1){
if(b&1)res=res*a%mo;
a=a*a%mo;
}
return res;
}
int main()
{
n=read(),k=read();
dp[1]=n;
for(int i=2;i<=k;i++)
for(int j=i;j>0;j--)
dp[j]=(dp[j-1]*(n-j+1)+dp[j]*j)%MOD;
for(int i=1;i<=k;i++)
if(n-i>=0)ans=(ans+dp[i]*ksm(2,n-i,MOD))%MOD;//令x等于1
printf("%lld\n",ans);
return 0;
}