Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何理解「;q=i-4&引用;在这个答案中?_C++_Algorithm - Fatal编程技术网

C++ 如何理解「;q=i-4&引用;在这个答案中?

C++ 如何理解「;q=i-4&引用;在这个答案中?,c++,algorithm,C++,Algorithm,问题描述 数字序列定义如下: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给定A,B和n,你要计算f(n)的值 输入 1 1 3 1 2 10 0 0 0 2 5 输入由多个测试用例组成。每个测试用例在一行上包含3个整数A、B和n(1b>>n&&A&&B&&n) { 对于(int i=3;i4) { 如果(f[i-1]==f[3]&&f[i]==f[4])//这里也是 { q=i-4;//我听不懂重点

问题描述

数字序列定义如下:

f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
给定A,B和n,你要计算f(n)的值

输入

1 1 3
1 2 10
0 0 0
2
5
输入由多个测试用例组成。每个测试用例在一行上包含3个整数A、B和n(1b>>n&&A&&B&&n) { 对于(int i=3;i<54;++i) { f[i]=(A*f[i-1]+B*f[i-2])%7; 如果(i>4) { 如果(f[i-1]==f[3]&&f[i]==f[4])//这里也是 { q=i-4;//我听不懂重点 } } }
是的,这种问题应该是来自在线法官(OJ)的问题。也许你是ACM的新手

我的答案是:

这个解决方案之所以能起作用,是因为
mod 7
,这意味着答案只能是0,1,2,3,4,5,6。所以,这个问题只从3循环到54,因为这就足够了。怎么说呢,因为f[n]只由它前面的两个值f[n-1]和f[n-2]决定,f[n-1]有7个选择(0-6),f[n-2]也有7个选择(0-6)

因此,循环数大于49就足够了,当一些f[n-1]和f[n-2]等于f[4]和f[3]时,以下值将是循环数

以您的第二个示例为例

f[1] = 1
f[2] = 1
A = 1
B = 2
n = 10 // or set n larger.
我们会得到

f[3] = 3
f[4] = 5
f[5] = 4
f[6] = 0
f[7] = 1
f[8] = 1
f[9] = 3
f[10] = 5
f[11] = 4
f[9]==f[3]
f[10]==f[4]
,然后它将以数字
4,0,1,1,3,5
循环

因此
q=i-4
删除了前四个数字,因此
n%q
是循环序列中第n个数字的位置


我想知道我是否已经清楚地说明了答案,希望这对您有所帮助。

是的,这种问题应该是OnlineJudge(OJ)的问题。也许您是ACM的新手

我的答案是:

这个解决方案之所以能起作用,是因为
mod 7
,这意味着答案只能是0,1,2,3,4,5,6。所以,这个问题只从3循环到54,因为这就足够了。怎么说呢,因为f[n]只由它前面的两个值f[n-1]和f[n-2]决定,f[n-1]有7个选择(0-6),f[n-2]也有7个选择(0-6)

因此,循环数大于49就足够了,当一些f[n-1]和f[n-2]等于f[4]和f[3]时,以下值将是循环数

以您的第二个示例为例

f[1] = 1
f[2] = 1
A = 1
B = 2
n = 10 // or set n larger.
我们会得到

f[3] = 3
f[4] = 5
f[5] = 4
f[6] = 0
f[7] = 1
f[8] = 1
f[9] = 3
f[10] = 5
f[11] = 4
f[9]==f[3]
f[10]==f[4]
,然后它将以数字
4,0,1,1,3,5
循环

因此
q=i-4
删除了前四个数字,因此
n%q
是循环序列中第n个数字的位置

我想知道我是否已经清楚地说明了答案,希望这对你有所帮助。

鉴于
f(n)
完全由
f(n-1)
f(n-2)
决定,任何
f(x)
都是0到6的整数,只有7*7=49个
f(n-1)
f(n-2)
。这意味着
f(x)
是周期性的,最大周期为49。一旦我们知道了周期,计算
f(n)
就像计算
f(n%周期)
一样简单,因为我们已经计算了
f(0)…f(48)
。确切的周期取决于
A
B
,需要计算。为了计算周期,我们只需要找到两个连续的
f
值的重复。也就是说,如果
f(x)=f(y)和&f(x+1)=f(y+1)
,那么
|y-x |
就是一个周期
f
或者它的整数倍。注意
f(n)==f(n%(k*period))
f(n)==f(n%period)
一样有效。因此,在所讨论的代码中
q
就是一个周期
f
,或者它的整数倍

现在,为什么代码预先计算
f(0)…f(53)
,而不是
f(0)…f(48)
?我认为这是一种过分的做法,因为超出最大周期的两个额外元素就足够了

关于所讨论的代码的另一个令人不安的事情是,
f[0]
是一个伪值,如果
n
q
的倍数,则很可能会返回该值。这可能是一个错误。为了防止它发生,我将
f
的索引移动1,使
f(0)==1&&f(1)==1
而不是
f(1)==1&&f(2)==1
假设
f(n)
完全由
f(n-1)
f(n-2)
决定,任何
f(x)
都是0到6的整数,那么
f(n-1)
f(n-2)
的组合只有7*7=49个。这意味着
f(x)
是周期性的,最大周期为49。一旦我们知道了周期,计算
f(n)
就像计算
f(n%周期)
一样简单,因为我们已经计算了
f(0)…f(48)
。确切的周期取决于
A
B
,需要计算。为了计算周期,我们只需要找到两个连续的
f
值的重复。也就是说,如果
f(x)=f(y)和&f(x+1)=f(y+1)
,那么
|y-x |
就是一个周期
f
或者它的整数倍。注意
f(n)==f(n%(k*period))
f(n)==f(n%period)
一样有效。因此,在所讨论的代码中
q
就是一个周期
f
,或者它的整数倍

现在,为什么代码预先计算
f(0)…f(53)
,而不是
f(0)…f(48)
?我认为这是一种过分的做法,因为超出最大周期的两个额外元素就足够了

关于所讨论的代码的另一个令人不安的事情是,
f[0]
是一个伪值,如果
n
q
的倍数,则很可能会返回该值。这可能是一个错误。为了防止它发生,我将