提交时间:2023-08-16 09:36:45

运行 ID: 98547

#include<bits/stdc++.h> using namespace std; inline int Read() { int x = 0 , f = 1; char c = getchar(); for( ; c < '0' || c > '9' ; c = getchar() ) f ^= ( c == '-' ); for( ; c >= '0' && c <= '9' ; c = getchar() ) x = ( x << 3 ) + ( x << 1 ) + ( c ^ 48 ); return f ? x : -x; } const int _ = 1e5 + 5 , Mod = 1e9 + 7; template<class T>T Pow(T a,T b,T p){T ans=1;for(;b;b/=2){ans=((b&1?a:1)*ans%p),a=a*a%p;}return ans;} template<class T>T Inv(T x,T Mod){return Pow(x,Mod-2,Mod);} int fac[_] , vac[_]; int C( int n , int m ) { return 1ll * fac[ n ] * vac[ m ] % Mod * vac[ n - m ] % Mod ; } struct Que { int n , k , id; } que[_]; int block; bool Cmp( Que a , Que b ) { return a.k / block == b.k / block ? ( a.k / block & 1 ? a.n / block < b.n / block : a.n / block > b.n / block ) : a.k / block < b.k / block ; } int tt; int ans[_]; void Init() { fac[ 0 ] = 1; for( int i = 1 ; i <= 100000 ; i++ ) fac[ i ] = 1ll * fac[ i - 1 ] * i % Mod; vac[ 0 ] = 1 , vac[ 100000 ] = Inv( 1ll * fac[ 100000 ] , 1ll * Mod ); for( int i = 99999 ; i >= 1 ; i-- ) vac[ i ] = 1ll * vac[ i + 1 ] * ( i + 1 ) % Mod; } signed main(){ Init(); tt = Read(); block = sqrt( _ - 5 ); for( int i = 1 ; i <= tt ; i++ ) { que[ i ].n = Read() , que[ i ].k = Read(); que[ i ].id = i; } sort( que + 1 , que + 1 + tt , Cmp ); int n = 1 , k = 0 , res = 1; for( int i = 1 ; i <= tt ; i++ ) { while( k > que[ i ].k ) res = ( res - C( n , k-- ) + Mod ) % Mod; while( n < que[ i ].n ) res = ( res * 2ll - C( n++ , k ) + Mod ) % Mod; while( k < que[ i ].k ) res = ( res + C( n , ++k ) ) % Mod; while( n > que[ i ].n ) res = ( res + C( --n , k ) ) % Mod * 500000004ll % Mod; ans[ que[ i ].id ] = res; } for( int i = 1 ; i <= tt ; i++ ) { printf( "%d\n" , ans[ i ] ); } return 0; }