4727 - Jump
Asia - Seoul - 2009/2010
Integers 1, 2, 3,..., n are placed on a circle in the increasing order as in the following figure. We want to
construct a sequence from these numbers on a circle. Starting with the number 1, we continually go round by
picking out each k-th number and send to a sequence queue until all numbers on the circle are exhausted. This
linearly arranged numbers in the queue are called Jump(n, k) sequence where 1 n, k.
Let us compute Jump(10, 2) sequence. The first 5 picked numbers are 2, 4, 6, 8, 10 as shown in the following
figure. And 3, 7, 1, 9 and 5 will follow. So we get Jump(10, 2) = [2,4,6,8,10,3,7,1,9,5]. In a similar way, we
can get easily Jump(13, 3) = [3,6,9,12,2,7,11,4,10,5,1,8,13], Jump(13, 10) = [10,7,5,4,6,9,13,8,3,12,1,11,2]
and Jump(10, 19) = [9,10,3,8,1,6,4,5,7,2].
Jump(10,2) = [2,4,6,8,10,3,7,1,9,5]
You write a program to print out the last three numbers of Jump(n, k) for n, k given. For example suppose that
n = 10, k = 2, then you should print 1, 9 and 5 on the output file. Note that Jump(1, k) = [1].
Input
Your program is to read the input from standard input. The input consists of T test cases. The number of test
cases T is given in the first line of the input. Each test case starts with a line containing two integers n and k,
where 5 n 500, 000 and 2 k 500, 000.
Output
Your program is to write to standard output. Print the last three numbers of Jump(n, k) in the order of the last
third, second and the last first. The following shows sample input and output for three test cases.
Sample Input
3
10 2
13 10
30000 54321
Sample Output
1 9 5
1 11 2
10775 17638 23432
题意:
约瑟夫环问题。给出 N 和 M,输出最后输出的三个数是什么。
思路:
递推。a,b,c 保存最后三个的数是什么。
AC:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { int t; scanf("%d", &t); while (t--) { int n, m; int a, b, c; scanf("%d%d", &n, &m); if (m % 6 == 1) a = 1, b = 2, c = 3; if (m % 6 == 2) a = 2, b = 1, c = 3; if (m % 6 == 3) a = 3, b = 1, c = 2; if (m % 6 == 4) a = 1, b = 3, c = 2; if (m % 6 == 5) a = 2, b = 3, c = 1; if (m % 6 == 0) a = 3, b = 2, c = 1; for (int i = 4; i <= n; ++i) { a = !((a + m) % i) ? i : (a + m) % i; b = !((b + m) % i) ? i : (b + m) % i; c = !((c + m) % i) ? i : (c + m) % i; } printf("%d %d %d\n", a, b, c); } return 0; }
相关推荐
在MATLAB这一强大的工程计算平台上,递推最小二乘法为处理动态系统提供了高效而简便的方法。本文将深入探讨如何在MATLAB中运用循环递推算法实现最小二乘法,并通过实例演示其具体应用。 首先,理解递推最小二乘法的...
递推算法是一种常见的算法,它通过已知的前几个数的数值,逐步推导出后续的数值。递推与动态规划(DP)在某些方面有相似之处,但它们在解决问题的方式和适用的场景上存在差异。动态规划通常涉及到状态转移方程的定义...
递推问题:递推与递归解法 递推问题的一般步骤: 一. 判断是否属于递推问题:这个没有可套用的公式,凭经验,具体问题具体考虑 如果把问题的规模缩小,得到的小问题与原问题在结构上性质上相同或相似,并且子问题与...
**归纳策略之递推算法详解** 递推算法是一种在解决问题时,通过定义当前状态与前一个或几个状态之间关系的方法。这种关系通常被表述为一个递推公式,用于描述序列中每一项如何由前面的项计算得出。在给定的描述中,...
递推求解是一种在计算机科学和数学中广泛使用的解决问题的方法,尤其在算法设计和理论分析中扮演着重要的角色。递推公式是递推求解的核心工具,它通过定义当前值与前一个或多个值的关系来表示序列或序列的元素。递推...
递推最小二乘法matlab程序
**递推专题训练** 在计算机科学领域,尤其是编程竞赛如NOIP(全国青少年信息学奥林匹克竞赛)和ACM(国际大学生程序设计竞赛)中,递推作为一种强大的算法思想,经常被用于解决各种复杂问题。递推是通过已知的前几...
本主题将深入探讨两种滤波方法:递推平均滤波(Recursive Average Filtering)和加权滤波(Weighted Filter),并通过C++编程示例进行阐述。 递推平均滤波是一种简单的线性滤波器,它通过不断更新平均值来实现对...
递推最小二乘算法递推最小二乘算法递推最小二乘算法递推最小二乘算法递推最小二乘算法递推最小二乘算法
本文所介绍的是一种基于递推预报误差算法的前馈神经网络的设计。这种网络设计在非线性系统模型的仿真试验中表现出了良好的效果,同时在文中也给出了试验的结果和网络应用的讨论。 首先需要了解的是前馈神经网络。...
算法分析中经常遇到需要求解递推式的情况,即将递推式改写为等价的封闭形式。例如汉诺塔问题的时间复杂度递推 形式为 T (n)=2T (n−1)+1 (n≥1) ,可以解出封闭形式为 T (n)=2 n −1 (设初始状态 T (0)=0 )。 因为...
关于几种递推
这两道题目都是基于递推关系来解决实际问题的典型实例,它们都涉及到寻找特定序列的通项公式,并通过编程实现来求解。 首先看第一道题,猴子爬山问题。猴子上山每步可以跳1级或3级,我们要找出到达30级台阶的不同...
这里是本蒟蒻整理/写的递归递推经典题目 上传供大家学习使用 包含:过河卒、过河卒升级版、汉诺塔、级数求和、勒让德多项式、流感传染、判断回文、判断元素是否存在、平方根级数、平面分割升级版、全排列递归版、...
递推算法是一种在计算机科学和数学中广泛应用的解决问题的方法,特别是在解决序列生成和动态规划问题时。递推算法的关键在于找到问题中相邻项之间的关系,然后通过这种关系推导出序列中的任意项。通常,递推关系可以...
"递推最小二乘法" 递推最小二乘法是解决线性方程组的重要方法之一。该方法基于递推最小二乘算法(RLS),可以求解线性方程组的最优解。递推最小二乘法的思想是将线性方程组转换为递推形式,然后使用递推最小二乘...
递推算法通常分为前向递推和后向递推,其中前向递推是从已知项开始,逐项推出后续项;后向递推则是从已知项开始逆向计算前一项。在实际编程应用中,递推算法可以用来求解诸如斐波那契数列等问题。 2. 楼梯走法问题...
rls算法,递推最小二乘法是最小二乘法中的一种快速算法。递推最小二乘(RLS)算法在迭代过程的每一步都能达到最佳迭代算法。RLS算法可以使输出信号在最小二乘意义上尽可能接近期望信号,因为它可以选择自适应滤波器...
学习常用算法之递推法 递推法是一种常用的算法,用于解决某个特定问题。它是一组有限个规则,提供了解决问题的运算序列。在计算机科学中,递推法是一种重要的算法思想,它可以帮助我们解决复杂的问题。 递推法的...