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
的倍数,则很可能会返回该值。这可能是一个错误。为了防止它发生,我将