输入描述:
多组读入数据T,
对于每组数据,
第1行一个整数n,q,n表示数列的大小,q为询问数
第2行读入n个数a1,a2,…,an,表示数列中的数
接下来q行,每行读入2个整数(x,k)如题所示
输出描述:
对于每个询问,输出并换行
示例1
输入
2
3 1
4 3 2
3 4
5 2
1 2 3 1234567 4
1234567 6
3 8
输出
4
1
2
备注:
T≤10,
对于每组数据,
1≤n,q≤5×104,
1≤ai≤109,
n≤k≤105,
x为数列A中的一个元素, ai互不相同。
伪代码:
#include<stdio.h>
#include<string.h>
typedef long long ll ;
ll mod = 1e9 + 7 ;
ll dp[500010] ;
ll fd( int n ) {
if( dp[n] > 0 ) return dp[n] ;
ll res = ( n * fd( n-1 ) ) % mod ;
return dp[n] = res ;
}
int bsearch( int* a , int x , int y , int v ) {
int m ;
while( x<y ) {
m = x + ( y-x ) / 2 ;
if( a[m] == v ) return m ;
else if( a[m] > v ) y = m ;
else x = m+1 ;
}
return -1 ;
}
ll hn( int g , int k , int n ) {
ll c = fd(k) / ( fd(g) * fd(k-g) ) ;
ll f = ( c%mod ) % n + 1 ;
return f ;
}
int a[500010] ;
int main() {
int t ;
memset( dp , -1 , sizeof(dp) ) ;
dp[0] = 1 ;
scanf("%d" , &t ) ;
while( t-- ) {
int n , q ;
scanf("%d%d" , &n , &q ) ;
for(int i=1 ; i<=n ; i++ ) {
scanf("%d" , &a[i] ) ;
}
int x , k ;
for( int i=1 ; i<=q ; i++ ) {
scanf("%d%d" , &x , &k ) ;
int g = bsearch( a , 1 , n , x ) ;
int h = hn( g , k , n ) ;
printf("%d\n" , a[h] ) ;
}
}
return 0 ;
}

2066

被折叠的 条评论
为什么被折叠?



