3517

1 /*
2 约瑟夫环的数学解法
3
4 举个例子来说明这个问题
5
6 比如有6个人,编号是从 0 1 2 3 4 5
7 每数5个人,出来一个。现在对于 N=6的情况,开始都是从0开始
8 那么4这个数字要出列,而新的数列变成了
9
10 5 0 1 2 3
11 | | | | |
12 0 1 2 3 4
13
14 把5 0 1 2 3重新编号,则成了N=5的子问题了,现在如果求除了F[5],那么F[6]怎么得到呢?
15
16 对于N=5,出列的数字是4,其对应于3,很显然对于N=6确实是这样的。从4到3,可以采用
17 (4+5)%6来转换
18 | |
19 K N
20
21 这样一个递推的关系就建立了,只要知道N-1的结果,N的结果就能知道
22 */
23
24 // include file
25 #include <cstdio>
26 #include <cstdlib>
27 #include <cstring>
28 #include <cmath>
29 #include <cctype>
30 #include <ctime>
31
32 #include <iostream>
33 #include <sstream>
34 #include <fstream>
35 #include <iomanip>
36 #include <bitset>
37 #include <strstream>
38
39 #include <algorithm>
40 #include <string>
41 #include <vector>
42 #include <queue>
43 #include <set>
44 #include <list>
45 #include <functional>
46
47 using namespace std;
48
49 // typedef
50 typedef long long LL;
51 typedef unsigned long long ULL;
52
53 //
54 #define read freopen("in.txt","r",stdin)
55 #define write freopen("out.txt","w",stdout)
56 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
57 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
58 #define FORk(a,b,c) for(int k=(a);k<(b);k+=c)
59 #define FORp(a,b,c) for(int p=(a);p<(b);p+=c)
60 #define FORii(a,b,c) for(int ii=(a);ii<(b);ii+=c)
61 #define FORjj(a,b,c) for(int jj=(a);jj<(b);jj+=c)
62 #define FORkk(a,b,c) for(int kk=(a);kk<(b);kk+=c)
63
64 #define FF(i,a) for(int i=0;i<(a);i+++)
65 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
66 #define Z(a) (a<<1)
67 #define Y(a) (a>>1)
68
69 const double eps = 1e-6;
70 const double INFf = 1e10;
71 const int INFi = 1000000000;
72 const double Pi = acos(-1.0);
73
74 template<class T> inline T sqr(T a){return a*a;}
75 template<class T> inline T TMAX(T x,T y)
76 {
77 if(x>y) return x;
78 return y;
79 }
80 template<class T> inline T TMIN(T x,T y)
81 {
82 if(x<y) return x;
83 return y;
84 }
85 template<class T> inline void SWAP(T &x,T &y)
86 {
87 T t = x;
88 x = y;
89 y = t;
90 }
91 template<class T> inline T MMAX(T x,T y,T z)
92 {
93 return TMAX(TMAX(x,y),z);
94 }
95
96
97 // code begin
98 int N,M,K;
99
100 int main()
101 {
102 read;
103 write;
104 while(scanf("%d %d %d",&N,&K,&M)!=-1) //从M开始,每过K个
105 {
106 if(N+M+K==0) break;
107 int s = 0;
108 for(int i=2;i<N;i++)
109 {
110 s = (s+K)%i;
111 }
112 printf("%d\n",(s+M)%N+1);
113 }
114 return 0;
115 }
posted @ 2011-03-08 10:40  AC2012  阅读(279)  评论(0编辑  收藏  举报