一个序列
g(1) = 1, g(2) = 1, g(m) = (x * g(m - 1) + y * g(m - 2)) % 7.
现给你x, y, m, 请计算出g(m)的值。
Input
多组输入数据。每组输入数据包含3个整数x, y,和m(数据保证1 <= x, y <= 1000, 1 <= m <= 100,000,000)。若x, y, m均为0,表示输入结束,该组数据不作处理。
Output
对于每组输入数据,在一行内输出g(m) 。
Sample Input
1 1 3 1 2 10 0 0 0
Sample Output
2 5
看样子很简单,但是也是有坑的,直接暴力会超时,这种取模的题目一般都会有规律。一开始寻找周期为7,周期太小,后来看到两个数相乘是以49为周期的,我们就直接算出一个周期来,就可以算出来后面的值了。
代码:
#include <iostream>
using namespace std;
int arr[50];
int main()
{
int n,a,b;
arr[1]=arr[2]=1;
while(cin>>a>>b>>n)
{
if(a==0&&b==0&&n==0)
break;
int minn=n<50?n:50;//一个小小的优化
for(int i=3; i<=minn; i++)
{
arr[i]=(a*arr[i-1]+b*arr[i-2])%7;
}
cout<<arr[n%49]<<endl;
}
return 0;
}
别看水,但是能卡住你。