UVa 1452 递推 Jump

约瑟夫变形,先计算出3个数时,最后三个数字的编号。

然后以这三个数为起点,就可以递推出n个数对应的最后三个数字的编号。

递推公式都是一样的。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int maxn = 500000 + 10;
 8 int f[maxn][3];
 9 
10 int main()
11 {
12     int T; scanf("%d", &T);
13     while(T--)
14     {
15         int n, k; scanf("%d%d", &n, &k);
16         f[1][2] = 0;
17         for(int i = 2; i <= 3; i++) f[i][2] = (f[i-1][2] + k) % i;
18         f[3][0] = ((k % 3) + 2) % 3;
19         f[3][1] = 3 - f[3][0] - f[3][2];
20         for(int i = 4; i <= n; i++)
21         {
22             f[i][0] = (f[i-1][0] + k) % i;
23             f[i][1] = (f[i-1][1] + k) % i;
24             f[i][2] = (f[i-1][2] + k) % i;
25         }
26         printf("%d %d %d
", f[n][0] + 1, f[n][1] + 1, f[n][2] + 1);
27     }
28 
29     return 0;
30 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4717111.html