数的变化

这里写图片描述
输入描述:

多组读入数据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 ;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值