约瑟夫变形,先计算出3个数时,最后三个数字的编号。
然后以这三个数为起点,就可以递推出n个数对应的最后三个数字的编号。
递推公式都是一样的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }