列表

详情


NC14621. 数的变换

描述

, (ai)
3
现在对于给定询问(x, k),求

输入描述

多组读入数据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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 346ms, 内存消耗: 12128K, 提交时间: 2019-02-14 21:52:45

#include<stdio.h>
#include<map>
using namespace std;
#define fo(i,a,b) for(int i=a;i<=b;i++)
map<int,int> g;
const int mn=100020;
int n,q,k,x,a[mn],T;
long long f[mn],inv[mn];
const int p=1e9+7;
inline int C(int n,int m){
	return f[n]*inv[m]%p*inv[n-m]%p;
}
int main(){
	f[0]=inv[0]=inv[1]=1;
	fo(i,1,100000) f[i]=f[i-1]*i%p;
	fo(i,2,100000) inv[i]=(p-p/i)*inv[p%i]%p;
	fo(i,2,100000) inv[i]=inv[i-1]*inv[i]%p;
	scanf("%d",&T);
	while (T--){
		g.clear();
		scanf("%d%d",&n,&q);
		fo(i,1,n) scanf("%d",&a[i]);
		fo(i,1,n) g[a[i]]=i;
		while (q--){
			scanf("%d%d",&x,&k);
			printf("%d\n",a[C(k,g[x])%n+1]);
		}
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 1362ms, 内存消耗: 11300K, 提交时间: 2018-03-08 16:53:59

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll mod=1e9+7;
int t,n,x,k,q;
int s[100005];
ll jc[100005];
map<int,int> mp; 
ll qpow(ll n,ll m){
	ll ans=1;
	while(m){
		if(m&1){
			ans=(ans*n)%mod;
		}
		m>>=1;
		n=(n*n)%mod; 
	}
	return ans;
}
int main()
{
	cin>>t;
	jc[0]=1;
	for(int i=1;i<=100000;i++){
		jc[i]=jc[i-1]*i%mod;
	}
	while(t--){
		mp.clear();
		cin>>n>>q;
		for(int i=1;i<=n;i++){
			cin>>s[i];
			mp[s[i]]=i;
		}
		while(q--){
			cin>>x>>k;
			x=mp[x];
			ll ans=jc[k]*qpow(jc[x]*jc[k-x]%mod,mod-2)%mod;
			ans=ans%n+1;
			cout<<s[ans]<<endl;		
		}
	}	
    return 0;
}
/*
*/

上一题