Mercado de valores de Hakata

Asunto:
https://ac.nowcoder.com/acm/problem/15550

A [0] [0] = p A [0] [0] = p A [ 0 ] [ 0 ]=p, 且
A [i] [j] = {A [i] [j - 1] i = 0, 0 <j <m máx ⁡ 0 ≤ 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 \ límites_ {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 ]yo=0 ,0<j<metro0 k jmáx{ A [ i-1 ] [ k ]+l = k + 1jj - kA [ i - 1 ] [ l ]}1i ,0j<m
A [ x ] [ y ] A[x][y] A[x][y]

Idea:
Calcule a mano y descubra que es AA0 0 de lamatriz AFila 0 y0 00 columnas sonppp, 然后
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 ]1i ,j<m
Usa la combinatoria para calcular el0º 0Fila 0 y0 0La contribución del número en la columna 0 es suficiente.

#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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_43520313/article/details/109230378
Recomendado
Clasificación