LA 3882 约瑟夫环变形(递推)

假设有n个人,每次从0数,删除第k个人。

此时编号

k    0

k+1     1

k+2      2

.....

倒着推会发现每一轮的胜利者编号都少了个K,然后利用递推复原回去。

f[n]=(f[n-1]+k)%n

直到最后一轮,最后的胜利者编号为0

f[1]=0,又由于本题是从编号为m,所以找到距m为k的位置即(m-k),所以答案为(f[n]+1+m-k)

由于m-k可能导致负数的情况,就再加n。

#include <bits/stdc++.h>
using namespace std;
const int maxn=10005;
int n,m,k;
int dp[maxn];
int main()
{
    while(scanf("%d%d%d",&n,&k,&m)&&(n||m||k))
    {
        memset(dp,0,sizeof(dp));
        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;
        ans = ((ans)%n+n)%n;
        if(ans==0) ans=n;
        printf("%d\n",ans);
    }
    return 0;
} 
发布了75 篇原创文章 · 获赞 77 · 访问量 4017

猜你喜欢

转载自blog.csdn.net/weixin_43568895/article/details/104667909
LA