hdu 1005 -- Number Sequence

Number Sequence

题目页面

思路:
如果暴力模拟,必定超时,因为 1 <= n <= 100,000,000
找规律,并未发现什么可循的规律
进一步观察题目发现:
f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7
-> f(n)的取值范围为 0~6
-> f(n - 1),f(n - 2) 数对的组合只有 49 种
-> 当 n 很大时,一定会有循环计算

用一个 7*7 的数组记录,f(n - 1),f(n - 2) 数对 的出现次序,用以计算循环长度和判断循环起始位置。

C 代码如下:

#include <stdio.h>
#include <string.h>

int A, B, n, a, b, c, i;
int mp[7][7];

int main() {
    while (1) {
        scanf("%d %d %d", &A, &B, &n);
        if (A == 0 && B == 0 && n == 0) break;

        if (n <= 2) {
            printf("1\n");
        }
        else {
            memset(mp, 0, sizeof(mp));
            a = 1;
            b = 1;
            mp[1][1] = 2;
            for (i = 3; i <= n; i++) {
                c = (A*b + B*a) % 7;
                a = b;
                b = c;
                if (mp[a][b]) break;
                mp[a][b] = i;
            }

            if (i < n) {
                n -= i;
                n %= i - mp[a][b];
                for (i = 0; i < n; i++) {
                    c = (A*b + B*a) % 7;
                    a = b;
                    b = c;
                }
            }

            printf("%d\n", c);
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值