BZOJ-4403 序列统计 组合数学 + Lucas定理

大家都很强, 可与之共勉。

统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量。

题解见 PoPoQQQ大神

/**************************************************************
    Problem: 4403
    User: Lazer2001
    Language: C++
    Result: Accepted
    Time:1040 ms
    Memory:8632 kb
****************************************************************/

#include 

const int Mod = 1000003 ;

int T, N, L, R ;
int fac[Mod], inv[Mod] ;

inline void Init ( )  {
    fac[0] = 1 ;
    inv[0] = inv[1] = 1;
    for ( int i = 1 ; i < Mod ; ++ i )   fac[i] = 1LL * fac[i - 1] * i % Mod ;
    for ( int i = 2 ; i < Mod ; ++ i )  inv[i] = 1LL * ( Mod - Mod / i ) * inv[Mod % i] % Mod ;
    for ( int i = 1 ; i < Mod ; ++ i )   inv[i] = 1LL * inv[i] * inv[i - 1] % Mod ;
}

inline int C ( int n, int m )  {
    if ( n < m )  return 0 ;
    if ( n < Mod && m < Mod )  return 1LL * fac[n] * inv[m] % Mod * 1LL * inv[n - m] % Mod ;
    return 1LL * C ( n / Mod, m / Mod ) * C ( n % Mod, m % Mod ) % Mod ;
}

int main ( )  {
    Init ( ) ;
    for ( scanf ( "%d", &T ) ; T ; --T )  {
        scanf ( "%d%d%d", &N, &L, &R ) ;
        printf ( "%d\n", ( C ( N + R - L + 1, R - L + 1 ) - 1 + Mod ) % Mod ) ;
    }
}

你可能感兴趣的:(Lucas定理)