Codeforce 450B Jzzhu and Sequences

B. Jzzhu and Sequences
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Jzzhu has invented a kind of sequences, they meet the following property:

You are given x and y, please calculate fn modulo 1000000007 (109 + 7).

Input

The first line contains two integers x and y (|x|, |y| ≤ 109). The second line contains a single integer n (1 ≤ n ≤ 2·109).

Output

Output a single integer representing fn modulo 1000000007 (109 + 7).

Examples
input
2 3
3
output
1
input
0 -1
2
output
1000000006
Note

In the first sample, f2 = f1 + f33 = 2 + f3f3 = 1.

In the second sample, f2 =  - 1 - 1 modulo (109 + 7) equals (109 + 6).


首先得到公式

然后构造矩阵,用矩阵加速

取模函数需要自己写一下,是数论中的取模。

#include<bits/stdc++.h>
using namespace std;
long long MOD = 1e9 + 7;
long long x, y;
int n;
long long mod(long long num, long long Mod)
{
    if(num > 0)
        return num % Mod;
    if(abs(num) % Mod == 0)
        return 0;
    return (num + Mod*(abs(num) / Mod + 1));
}
struct Matrix
{
    long long A[3][3];
    int R, C;
    Matrix operator*(Matrix b);
}X, Y, Z;
Matrix Matrix::operator*(Matrix b)
{
    Matrix c;
    memset(c.A, 0, sizeof(c.A));
    for(int i = 1; i <= R; i++)
        for(int j = 1; j <= C; j++)
            for(int k = 1; k <= C; k++)
                c.A[i][j] = mod((c.A[i][j] + mod(A[i][k]*b.A[k][j], MOD)), MOD);
    c.R = R;c.C = b.C;
    return c;
}
void init()
{
    n = n -1;
    Z.A[1][1] = x; Z.A[1][2] = y; Z.R = 1; Z.C = 2;
    Y.A[1][1] = 1; Y.A[1][2] = 0; Y.A[2][1] = 0; Y.A[2][2] = 1;Y.R = 2; Y.C = 2;
    X.A[1][1] = 0; X.A[1][2] = -1; X.A[2][1] = 1; X.A[2][2] = 1;X.R = 2; X.C = 2;
}
void print()
{
    while (n)
    {
        if(n % 2 == 1)
            Y = Y * X;
        n >>= 1;
        X = X * X;
    }
    Z = Z * Y;
    printf("%I64d\n", mod(Z.A[1][1], MOD));
}
int main()
{
    while(scanf("%I64d%I64d%d", &x, &y, &n) != EOF)
    {
        init();
        print();
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值