HDU1005Number Sequence

本文介绍了一个特定数值序列的计算方法,通过寻找序列中的循环节来高效计算第n项的值。利用递推公式f(n)=(A*f(n-1)+B*f(n-2))%7,文章提供了一种算法实现思路,避免了暴力循环导致的时间超限问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A number sequence is defined as follows:

f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

Given A, B, and n, you are to calculate the value of f(n).

Input

The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.


Output

For each test case, print the value of f(n) on a single line.


Sample Input

1 1 3
1 2 10
0 0 0


Sample Output

2

5

这个题不能暴力循环,一是时间超出限制,二是明显有个%7——就在提醒我们有个内部循环节(否则为什么不mod1000000007)

关键在于找循环长度

由递推公式可以知道如果连续两个数值和前面连续两个数重复那么就找到了循环节了(两个数就可以确定第三个数了)

而且循环节的起始点不一定是第一个数,所以输入的n应该减去非循环部分,所以j的生存域得大一点

#include<iostream>
#include<algorithm>
#include<memory.h>
using namespace std;
int findreg[1010];
int main()
{
	int a,b;
	int n;
//	int num1 ;
//	int num2 ;
//	int num3;

	while(cin>>a>>b>>n)
	{
		if(a == 0 && b == 0 && n == 0)break;
		int j;	
		int retur = 0;
		memset(findreg,0,sizeof(findreg));
		findreg[1] = 1;
		findreg[2] = 1;
		if(n == 1 || n == 2)
		{
			cout<<"1"<<endl;
			continue;
		}
		else
		{
			for(int i = 3;i <= 10005;i++)
			{
				findreg[i] = (a * findreg[i - 1] + b * findreg[i - 2]) % 7;
				for(j = 2;j < i;j++)
				{
					if(findreg[i] == findreg[j] && findreg[i - 1] == findreg[j - 1])
					{
						retur = i - j;
						break;
					}//遍历去找循环节 
					
				}
				if(retur)
				{
					break;
				}
			}
			if(n < j)
			{
				cout<<findreg[n]<<endl;
			}
			else
			{
				cout<<findreg[(n - j) % retur + j]<<endl;//开头不是循环节的地方要减去 
			}
			
		}
		
	}
	
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值