HDU1005(矩阵快速幂)

来源:互联网 发布:linux telnet传输文件 编辑:程序博客网 时间:2024/05/29 11:03

Description

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 31 2 100 0 0

Sample Output

25

Fn+3        Fn+2               Fn+2        Fn+1            a        1

                                 =                                      *

Fn+2        Fn+1               Fn+1        Fn                 b        0


#include<cstdio>using namespace std;int n,a,b;struct Matrix{    int m[2][2];    void init()    {        m[0][0]=a;        m[0][1]=1;        m[1][0]=b;        m[1][1]=0;    }    void init0()    {        m[0][0]=a+b;        m[0][1]=1;        m[1][0]=1;        m[1][1]=1;    }    void init2()    {        m[0][0]=1;        m[0][1]=0;        m[1][0]=0;        m[1][1]=1;    }};Matrix multiply(Matrix x,Matrix y){    Matrix res;    for (int i = 0 ;i < 2; i++)    {        for (int j = 0 ;j < 2 ;j++)        {            res.m[i][j] = 0;            for (int k = 0 ;k < 2 ;k++)                res.m[i][j] += (x.m[i][k] * y.m[k][j]);            res.m[i][j] %= 7;        }    }    return res;}Matrix quickpow(Matrix s,int k){    Matrix res;    res.init2();    while(k)    {        if(k&1)            res = multiply(res ,s);        k >>= 1;        s = multiply(s ,s);    }    return res;}int main(){    while (scanf("%d%d%d",&a,&b,&n)&&(a||b||n))    {        if(n==1||n==2)        {            printf("1\n");            continue;        }        Matrix ans;        ans.init0();        Matrix t;        t.init();        ans = multiply(ans ,quickpow(t ,n-2));        printf("%d\n",ans.m[0][1] % 7);    }    return 0;}


0 0