POJ 1012

这个是约瑟夫环的变形,它要求先除去的必须是K个以后的人。

因为k<14,可以直接暴力。

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int f[20];
 5 int res[20];
 6 
 7 int get_f(int y, int x, int m)
 8 {
 9     if (x == y)return (m-1)%x;
10     return (get_f(y-1,x,m) + m)%y;
11 }
12 
13 void prepare()
14 {
15     int ind(0);
16     for (int i(1); i<14; ++i) {
17         bool flag = true;
18         int cnt(1);
19         while (flag) {
20             flag = false;
21             for (int j(1); j<=i; ++j) {
22                 int num = get_f(2*i,2*i-j+1,cnt) + 1;
23                 //cout<<cnt<<" "<<num<<" "<<i<<endl;
24                 if (num <= i) {
25                     flag = true;
26                     ++cnt;
27                     break;
28                 }
29                 //system("pause");
30             }
31         }
32         res[++ind] = cnt;
33     }
34 } 
35 
36 int main()
37 {
38     int k;
39     prepare();
40     while (scanf("%d",&k) && k) {
41         cout<<res[k]<<endl;    
42     }
43     return 0;
44 }
posted on 2012-08-22 21:55  Dev-T  阅读(176)  评论(0编辑  收藏  举报