Uva 题目:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1883
这个题类似于约瑟夫环,但是由于题目数据比较大,所以只能采用递推的做法。
可以通过画图的方法得到转移方程,即dp[n]=(dp[n-1]+k)%n
最后仅仅是需要加上开始的位置偏差即可。
由于k的数值比较大,最后可能出现负数与0的情况,需要特殊处理一下。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1e4+10;
int dp[maxn];
int main()
{
int n,k,m;
while(scanf("%d%d%d",&n,&k,&m)&&n)
{
dp[1]=0;
for(int i=2;i<=n;i++)
dp[i]=(dp[i-1]+k)%i;
int ans=(dp[n]+m-k+1)%n;
if(ans<=0)
ans=ans+n;
printf("%d\n",ans);
}
return 0;
}