hdu 1005 -- Number Sequence

来源:互联网 发布:sdcms 域名未授权 编辑:程序博客网 时间:2024/06/05 03:24

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
原创粉丝点击