Number Sequence HDU - 1005(思维水)

本文探讨了一种高效计算模7数列g(m)的方法,通过发现数列以49为周期的特性,避免了直接暴力计算导致的时间复杂度过高问题。通过预计算一个周期内的值,可以快速得出任意项g(m)的值。

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

一个序列

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;

}

别看水,但是能卡住你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值