题目链接https://nanti.jisuanke.com/t/41352
大概的模型就是一个约瑟夫环
例如题目样例,可以改写成:
5
5
5个人围成一圈,第一个人第一个退出,报数
2
2
2,报到
1
1
1的人退出,问第
x
x
x个人是第几轮退出的
这个题6s 而且只有10组。。感觉 O ( n m ) O(nm) O(nm)的复杂度是可以过的,结果真就过了。。
具体的实现用最暴力的方法
t
t
t了,改进了一下用一个
n
e
x
[
i
]
nex[i]
nex[i]表示离
i
i
i最近的未出局的下标。
如果这个点报数到了1退出了,那么就有
n
e
x
[
i
]
=
n
e
x
[
n
e
x
[
i
]
]
nex[i]=nex[nex[i]]
nex[i]=nex[nex[i]]
p
s
:
ps:
ps:也可以用循环链表实现
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <bits/stdc++.h>
typedef long long ll;
#define int ll
using namespace std;
const int mod=998244353;
int t,n,q,k;
const int maxn=(int)4e7+5;
int m;
int res[maxn];//反向存f[顺序]=数
int nex[maxn];
int ans[maxn];//12345排列取出来的顺序
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n>>k>>q;
//k++;
for(int i=1;i<n;i++)nex[i]=i+1;
nex[n]=1;
int it=1;
int now=n;
for(int i=1;i<=n;i++)
{
ans[it++]=nex[now];
nex[now]=nex[nex[now]];
for(int j=1;j<=k;j++)
{
now=nex[now];
}
}
int ind=1;
for(int i=1;i<=n;i++)
{
res[ans[i]]=i;
}
int xx;
while(q--)
{
cin>>xx;
cout<<res[xx]<<endl;
}
}
return 0;
}