Codeforces Round #258 (Div. 2) B. Jzzhu and Sequences(矩阵快速幂)

题目链接:http://codeforces.com/problemset/problem/450/B

----------------------------------------------------------------------------------------------------------------------------------------------------------
欢迎光临天资小屋http://user.qzone.qq.com/593830943/main

----------------------------------------------------------------------------------------------------------------------------------------------------------

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).

Sample test(s)

input

2 3
3

output

1

input

0 -1
2

output

1000000006

Note

In the first sample, f2?=?f1?+?f3, 3?=?2?+?f3, f3?=?1.

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

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct A
{
    int mat[2][2];
};
A d,f;
__int64 n,mod;
A mul(A a,A b)
{
    A t;
    memset(t.mat,0,sizeof(t.mat));
    for(int i=0;i<n;i++)
    {
        for(int k=0;k<n;k++)
        {
            if(a.mat[i][k])
                for(int j=0;j<n;j++)
                {
                    t.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
                    t.mat[i][j]%=mod;
                }
        }
    }
    return t;
}
A quickP(int k)
{
    A p = d ,m;
    memset(m.mat,0,sizeof(m.mat));
    for(int i=0;i<n;++i)//单位矩阵
    {
        m.mat[i][i]=1;
    }
    while(k)
    {
        if(k & 1)
            m=mul(m,p);
        p=mul(p,p);
        k >>= 1 ;
    }
    return m;
}
int main()
{
    n=2;
    int k,t;__int64 x,y,z;
    while(scanf("%I64d%I64d",&x,&y)!=EOF)
    {
        int s=0;
        scanf("%I64d",&z);
        mod=1000000007;
        if(z == 1)
        {
            if(x < 0)
                printf("%I64d\n",x+mod);
            else
                printf("%I64d\n",x);
            continue;
        }
        d.mat[0][1]=-1;d.mat[1][1] = 0;
        d.mat[0][0]=d.mat[1][0]=1;
        A ret=quickP(z-2);//z-2 乘的次数
        __int64 ans=(ret.mat[0][0]*y%mod+ret.mat[0][1]*x%mod)%mod;
        if(ans < 0)
            ans+=mod;
        printf("%I64d\n",ans);
    }
    return 0;
}
时间: 2024-10-14 12:38:53

Codeforces Round #258 (Div. 2) B. Jzzhu and Sequences(矩阵快速幂)的相关文章

Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)

题目链接:http://codeforces.com/problemset/problem/450/B 题意很好懂,矩阵快速幂模版题. 1 /* 2 | 1, -1 | | fn | 3 | 1, 0 | | fn-1 | 4 */ 5 #include <iostream> 6 #include <cstdio> 7 #include <cstring> 8 using namespace std; 9 typedef __int64 LL; 10 LL mod =

Codeforces 450B div.2 Jzzhu and Sequences 矩阵快速幂or规律

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 i

Codeforces Round #257 (Div. 2) B Jzzhu and Sequences

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 i

Codeforces 450B - Jzzhu and Sequences ( 矩阵快速幂 )

题意: 给定f1和f2,求fn 分析: 特判f1,f2 当n>=3时使用矩阵快速幂即可( 简单题 ) 将公式转化一下 , 可以得到一个变换矩阵 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MAT_SIZE 2 #define MOD 10

Jzzhu and Sequences (矩阵快速幂 + 取模)

题目链接 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 sin

Codeforces Round #258 (Div. 2)

A - Game With Sticks 题目的意思: n个水平条,m个竖直条,组成网格,每次删除交点所在的行和列,两个人轮流删除,直到最后没有交点为止,最后不能再删除的人将输掉 解题思路: 每次删除交点所在的行和列,则剩下n-1行和m-1列,直到行或列被删完为止,最多删除的次数为min(n,m),删除min(n,m)后剩余的都是行或者列(注意行与行,列与列之间不可能有交点).只需要判断min(n,m)的奇偶性. #include <iostream> #include <vector&

Codeforces Round #258 (Div. 2) B. Sort the Array(简单题)

题目链接:http://codeforces.com/contest/451/problem/B ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943/ma

Codeforces Round #258 (Div. 2) A. Game With Sticks(数学题)

题目链接:http://codeforces.com/contest/451/problem/A ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943/ma

Codeforces Round #258 (Div. 2) 小结

A. Game With Sticks (451A) 水题一道,事实上无论你选取哪一个交叉点,结果都是行数列数都减一,那如今就是谁先减到行.列有一个为0,那么谁就赢了.因为Akshat先选,因此假设行列中最小的一个为奇数,那么Akshat赢,否则Malvika赢. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace