问题
https://vjudge.net/problem/UVA-1452
分析
约瑟夫环的变种,我对于约瑟夫环的理解还是不够,理解了约瑟夫环是一个递归问题,f[1]=0,f[i]=f[i-1]+k mod i是每次重新编号,从结果往开始递归的结果后就解决问题了
参见 https://baike.baidu.com/item/约瑟夫问题/3857719?fromtitle=约瑟夫环&fromid=348830&fr=aladdin
代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=500000+5;
int n,k,kase;
int main(void){
scanf("%d",&kase);
while(kase--){
int a0,a1,a2;
scanf("%d%d",&n,&k);
//最后一轮的编号
a0=0;
//倒数第二轮,出现了倒数第二个的数字的编号
a0=(a0+k)%2;
a1=1-a0;
//倒数第三轮,出现了第三个
a0=(a0+k)%3;
a1=(a1+k)%3;
a2=3-a0-a1;
//先前迭代,找到最初的编号
//f[1]=0
//f[i]=(f[i-1]+k)%i;
for(int i=4;i<=n;++i){
a0=(a0+k)%i;
a1=(a1+k)%i;
a2=(a2+k)%i;
}
//从1-n,所以都要加1
printf("%d %d %d\n",a2+1,a1+1,a0+1);
}
return 0;
}