件名:https :
//ac.nowcoder.com/acm/problem/15550
A [0] [0] = p A [0] [0] = p A [ 0 ] [ 0 ]=p、ANDA
[i] [j] = {A [i] [j − 1] i = 0、0 <j <mmax0≤k≤j{A [i − 1] [k] + ∑ l = k + 1 j A [i − 1] [l] j − k}1≤i、0≤j<m A [i] [j] = \ begin {cases} A [i] [j-1] \ quad i = 0,0 <j <m \\ \ max \ limits_ {0 \ le k \ le j} \ {A [i-1] [k] + \ sum_ {l = k + 1} ^ {j} \ frac {A [i-1] [l]} {jk} \} \ quad 1 \ le i、0 \ le j <m \ end {cases}A [ i ] [ j ]=⎩⎨⎧A [ i ] [ j−1 ]私=0 、0<j<m0 ≤ K ≤ J最大{
A [ i−1 ] [ k ]+∑l = k + 1Jj − kA [ I - 1 ] [ L ]}1≤私、0≤j<メートル
求A [x] [y] A [x] [y]A [ x ] [ y ]
アイデア:
手作業で計算し、AAであることを確認しますA配列の00行0および000列はppですp、然后A [i] [j] = A [i − 1] [j] + A [i − 1] [j − 1] 1≤i
、j <m A [i] [j] = A [i -1] [j] + A [i-1] [j-1] \ quad 1 \ le i、j <mA [ i ] [ j ]=A [ i−1 ] [ j ]+A [ i−1 ] [ j−1 ]1≤私、j<m
組み合わせを使用して0番目の0を計算します行0および000列の数字の寄与で十分です。
#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;
const int N=1000009;
int T;
ll p[N],p1[N],m,x,y,P;
ll qpow(ll a, ll b) {
ll res=1;
a%=mod;
while(b) {
if(b&1)
res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
ll cal(ll a,ll b) {
if(a<0||b<0||a-b<0)
return 0;
return p[a]*p1[b]%mod*p1[a-b]%mod;
}
int main() {
p[0]=1;
for(int i=1; i<N; i++)
p[i]=p[i-1]*i%mod;
p1[N-1]=qpow(p[N-1],mod-2);
for(int i=N-2; i>=0; i--)
p1[i]=p1[i+1]*(i+1)%mod;
while(scanf("%lld%lld%lld%lld",&m,&x,&y,&P)==4) {
ll ans=0;
x--;
if(!x||!y) {
cout<<P<<endl;
continue;
}
ans+=cal(x,y);
for(int i=1; i<=y; i++)
ans=(ans+cal(x,y-i))%mod;
cout<<ans*P%mod<<endl;
}
return 0;
}