BZOJ 4403序列统计
BZOJ-序列统计
·题意
给你 \(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' ;
}
}