题目链接:https://nanti.jisuanke.com/t/41352
题目大意:第一次取第一张牌,然后不断把第一张牌放最下面连续m次,再把第一张牌取出来,要求取出来的牌从1~n
题目思路:其实这也是假方法,后台数据水了,O(TNM)不应该能过,但是好像题解也是这个方法???不太懂。其实就是每个数组记录的是他下一步要去的是哪一张牌,然后每次暴力跳m下即可
以下是代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int MAXN = 4e7+5;
const int MOD = 998244353;
int ans[MAXN],a[MAXN],x;
int main() {
int t,n,m,q;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&q);
rep(i,0,n-2){
a[i]=i+1;
}a[n-1]=1;
ans[0]=0;
int pos=1,pre;
rep(i,1,n-1){
rep(j,1,m){
pre=pos;
pos=a[pos];
}
ans[pos]=i;
a[pre]=a[pos];
pos=a[pos];
}
rep(i,1,q){
scanf("%d",&x);
printf("%d\n",ans[x-1]+1);
}
}
}