hdu1005

规律题,对于f(n -1)由于对7取模,故只有0,1,2,...,6七种选择,同理f(n - 2)也是七种,由于a和b又是常数,故一共有7*7=49种组合,也就是说在50个之内定会出现循环节点,找到循环节点即可

#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

int main()
{
    int r[55];
    int i, j, a, b, n, beg, en, flag;
    while (~scanf("%d%d%d", &a, &b, &n) && (a || b || n)) {
        r[0] = r[1] = r[2] = 1;
        flag = 0;
        for (i = 3; i <= n; i++) {
            r[i] = (a * r[i - 1] + b * r[i - 2]) % 7;
            for (j = 2; j <= i - 1; j++) {     ///在i之前的遍历r,看是否有循环节,有则结束计算,flag = 1
                if (r[i] == r[j] && r[i - 1] == r[j - 1]) {
                    flag = 1;
                    beg = j;
                    en = i;
                    break;
                }
            }
            if (flag) break;
        }

        if (flag) {   ///给的n已经超过了循环区间的大小
            printf("%d\n", r[beg + (n - en) % (en - beg)]);
        } else {  
            printf("%d\n", r[n]); ///给的n还没有出现循环,直接输出r[n]即可
        }

    }
    return 0;
}


你可能感兴趣的:(ACM,规律,hduoj)