bzoj4403 序列统计

我们很容易知道要求的式为

由公式

化得

lucas定理求得

 1 #include<cstdio>
 2 using namespace std ; 
 3 
 4 const long long MOD = ( long long ) 1e6 + 3 ;
 5 const long long MAXN = MOD ;
 6 
 7 long long mypow ( register long long a , register int n ) {
 8     register long long ans = 1 ;
 9     while ( n ) {
10         if ( n & 1 ) ans = ans * a % MOD ;
11         n >>= 1 ;
12         a = a * a % MOD ;
13     }
14     return ans ;
15 }
16 
17 long long p [ MAXN ] ;
18 void get_c () {
19     register long long o = 1 ; 
20     long long N = MOD ;
21     p [ 0 ] = 1 ;
22     for ( register int i = 1 ; i < N ; ++ i ) p [ i ] = o = ( o * i % MOD ) ;
23 }
24 
25 long long _C ( const int n , const int m ) {
26     if ( n > m ) return 0 ;
27     return p [ m ] * mypow (  p [ n ] , MOD - 2 )  % MOD * mypow ( p [ m - n ] , MOD - 2 ) % MOD  ;
28 }
29 
30 long long C ( long long n , long long m ) {
31     //printf ( "%lld %lld\n" , n , m ) ;
32     long long ans = 1 ;
33     while ( m ) {
34         ans = ans * _C ( n % MOD , m % MOD ) % MOD ;
35         n /= MOD ; m /= MOD ;
36     }
37     return ans ;
38 }
39 
40 void solve () {
41     int n , L , R ;
42     scanf ( "%d%d%d" , & n , & L , & R ) ;
43     printf ( "%lld\n" , ( C ( ( n - 1 ) + 1 , R - L + ( n - 1 ) + 2 ) + ( MOD - 1 ) ) % MOD ) ;
44 }
45 
46 int T ;
47 int main () {
48     get_c () ;
49     scanf ( "%d" , & T ) ;
50     while ( T -- ) 
51         solve () ;
52     return 0 ;
53 }

 

posted @ 2016-01-22 08:34  Chris_2  阅读(360)  评论(0编辑  收藏  举报