LA3882 And Then There Was One

来源:互联网 发布:乐高 t r3x 编程下载 编辑:程序博客网 时间:2024/06/06 02:16

题目描述 传送门


蓝书上的例题,递推法求之。
f(n)为0~n-1个数字围成一圈,从0开始每k个删一次最后删的数。

f(n)=(f(n1)+k)%n

最终答案是 (f[n]+m-k+1)%n 注意可能是负数,还要处理一下。

代码

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;int f[10010];int main(){    int n,k,m;    f[1]=0;    while(scanf("%d%d%d",&n,&k,&m)==3&&!(!n&&!k&&!m)){        for(int i=2;i<=n;i++) f[i]=(f[i-1]+k)%i;        int ans=(f[n]+m-k+1)%n;        while(ans<=0) ans+=n;        printf("%d\n",ans);    }    return 0;}