NC14621. 数的变换
描述
输入描述
多组读入数据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; } /* */