给n我的围城一个环,从m号开始杀,每次隔k-1我的(从上一次被杀的人下一个开始数k下,第k我的被杀),问最后剩下的人是几号。ios
bc的75场有一个边形,uvalive3882 也是个变形;spa
思路:code
咱们能够递推解决,设 f[n] 表示的是第 n 个被杀的人是谁。blog
首先咱们将人从0开始编号,而后就是0~n-1 。string
f[ 1 ] =0;it
第一次咱们杀的是k-1号,而后咱们从新编号,从原来的第k个开始编0号,io
而后若是咱们知道剩余的n-1 的人剩余的是谁,那么原来这我的的编号就是加上k后的值;class
而后再反推一下。stream
那么,咱们知道,到最后,剩一我的的时候,他的编号确定是0,并且必须死,因此有上面的f[1] = 0;im
那么他在上一次的编号是多少呢?
若是k =3, 那么他的编号应该是 (0+3)%2 =1;
咱们来验证一下, 0 、一、 0 ,0死了,1剩下了。对的。
因此。。。。就很简单了,递推一下就结束了,记得回头加上1;
/************************************************************************* > File Name: uvalive3882.cpp > Author: Baiyan > 题意: > Created Time: 2016年05月28日 星期六 17时08分47秒 **********************************************************************/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int f[10005]; int main() { int n,m,k; while(scanf("%d%d%d", &n,&k,&m)!=EOF &&( n||k||m)) { memset(f,0,sizeof(f)); f[1]= 0; for(int i=2;i<=n;i++) { if(i<n) f[i] = (f[i-1]+k)%i; else f[i] = (f[i-1]+m)%i; //这里就是当前杀第几我的就加几 } printf("%d\n",f[n]+1); } return 0; }