BZOJ 4403序列统计

BZOJ-序列统计

$$HZOI$$

·题意

给你 \(n\) , \(l\) , \(r\) , 你可以于 \([ l , r ]\) 中选 \(n\) , 个数 , 组成的序列为不下降序列的个数 , 对 \(mod = 10^9 + 7\)

\(n \le 10^9 , l \le r \le 10 ^ 9\)

·题解

明显的得到式子:

\[ans = \sum^{n}_{i = 1}C^{i}_{r - l + 1 + i} \]

用杨辉三角化一下得到:

\[C^{n}_{n + r - l + 1} - 1 \]

code

#include<bits/stdc++.h>
#define int long long
#define lson ( id << 1 ) 
#define rson ( id << 1 | 1 )
using namespace std ; 
const int N = 1000010 ; 
const int mod = 1e6 + 3 ; 
namespace Combination
{
    int D[ N ] ; int nueyong[ N ] , sum_neo[ N ] , sum[ N ] ; 
    inline void lear_neoyong( )
    {
        sum_neo[ 0 ] = sum_neo[ 1 ] = 1 ; 
        nueyong[ 1 ] = 1 ; nueyong[ 0 ] = 1 ; 
        sum[ 0 ] = sum[ 1 ] = 1 ; 
        for( int i = 2 ; i < N ; ++ i )
        {
            int p = mod ; 
            int k = p / i ; 
            nueyong[ i ] = ( k * ( p - nueyong[ p % i ] ) ) % p ; 
            sum_neo[ i ] = ( nueyong[ i ] * sum_neo[ i - 1 ] ) % p ; 
            sum[ i ] = ( i * sum[ i - 1 ] ) % p ; 
        }
    }
    int Quick_Pow( int alpha , int beta )
    {
        int ans = 1 ; 
        while ( beta > 0 )
        {
            if( beta & 1 ) ans = ( ans * alpha ) % mod ; 
            beta >>= 1 ; 
            alpha = ( alpha * alpha ) % mod ;  
        }
        return ans ; 
    }
    int Regular_C_of_Pow_Class( int n , int m )
    {
        int alpha = 1 , beta = 1 , rereturn = 0 ; 
        if( m <= n && n >= 0 && m >= 0 )
        {
            for( int i = n - m + 1 ; i <= n ; ++ i )
            {
                alpha = ( alpha * i ) % mod ; 
            }
            for( int i = 1 ; i <= m ; ++ i )
            {
                beta = ( beta * i ) % mod ; 
            }   
            rereturn = ( alpha * Quick_Pow( beta , mod - 2 ) ) % mod ;  
            return rereturn ; 
        }
        else return 0 ; 
    }
    inline int jc( int x )
    {
        return sum[ x ] ; 
    }   
    inline int neo_jc( int x )
    {  
        if( x == 0 ) return 1 ; 
        return sum_neo[ x ] ; 
    }
    int Regular_C_of_Inv( int n , int m )
    {
        return ( ( ( jc( n ) * neo_jc( n - m ) ) % mod ) * neo_jc( m ) ) % mod ; 
    }
    int C_Lucas_Using_Inv( int n , int m )
    {
        if( m == 0 ) return 1 ; 
        return ( Regular_C_of_Inv( n % mod , m % mod ) * C_Lucas_Using_Inv( n / mod , m / mod ) ) % mod ; 
    }
    int C_Lucas_Using_Pow( int n , int m )
    {
        if( m == 0 ) return 1 ; 
        return ( Regular_C_of_Pow_Class( n % mod , m % mod ) * C_Lucas_Using_Pow( n / mod , m / mod ) ) % mod ; 
    }
    void Asking_for_Derangement( )
    {
        D[ 0 ] = 1 ; 
        D[ 1 ] = 0 ; 
        D[ 2 ] = 1 ; 
        for( int i = 3 ; i < N ; ++ i )
        {
            D[ i ] = ( i - 1 ) * ( D[ i - 1 ] + D[ i - 2 ] ) % mod ; 
        }
    }
    inline void Cleared( )
    {
        memset( D , 0 , sizeof( D ) ) ; 
        memset( sum_neo , 0 , sizeof( sum_neo ) ) ; 
        memset( sum , 0 , sizeof( sum ) ) ;  
        memset( nueyong , 0 , sizeof( nueyong ) ) ; 
    }
} ; 
using namespace Combination ; 
inline int read( )
{
    int x = 0 , f = 1 ; 
    char c = getchar( ) ; 
    while ( c < '0' || c > '9' )
    {
        if( c == '-' )
        {
            f = -1 ; 
        }
        c = getchar( ) ; 
    }
    while ( c >= '0' && c <= '9' )
    {
        x = x * 10 + c - '0' ; 
        c = getchar( ) ;  
    }
    return x * f ; 
}
int l , r , n , t ; 
signed main( )
{
    #ifndef ONLINE_JUDGE
        freopen( "cjs.in" , "r" , stdin ) ; 
        freopen( "cjs.out" , "w" , stdout ) ; 
    #endif
    t = read( ) ;
    while ( t -- )
    {
        n = read( ) ; l = read( ) ; r = read( ) ; 
        int m = r - l + 1 ; 
        cout << ( C_Lucas_Using_Pow( n + m , n ) - 1 + mod ) % mod << '\n' ; 
    }
}
posted @ 2024-03-21 07:57  HANGRY_Sol&Cekas  阅读(32)  评论(0编辑  收藏  举报