CodeForces 450B Jzzhu and Sequences (矩阵优化)

Description

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

\[f_1=x
\]

\[f_2=y
\]

\[f_i=f_{i-1}+f_{i+1}\text {(i>2)}
\]

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 Input

Input1:

2 3

3

Input2:

0 -1

2

Sample Output

Output1:

1

Output2:

1000000006

Http

CodeForces:https://vjudge.net/problem/CodeForces-450B

Source

矩阵,递推

题目大意

给定f1和f2,要按照$$f_i=f_{i-1}+f_{i+1}\text {(i>2)}$$求出fn

解决思路

刚看到递推式子的时候有些摸不着头脑,这个要推出fi要先推出fi-1和fi+1,怎么做呢?

其实很简单,把式子变一下形:

\[f_{i+1}=f_i-f_{i-1}
\]

于是我们就得到:

\[f_i=f_{i-1}-f_{i-2}
\]

当然,看到题目的数据范围,直接这么傻推是不行的,我们要用矩阵优化!

关于矩阵的基本内容请到我的这一篇文章阅读。

经过推理,我们可以得到本题的转移矩阵T是:

\[T=\begin{bmatrix} 1 & 1 \\ -1 & 0 \end{bmatrix}
\]

然后直接用矩阵快速幂就可以了。

最后要注意的一点就是,题目中给出的x和y都有可能是负数,并且求解过程中也有可能出现负数(因为有减法操作嘛),所以在取膜的时候,要先+Mod,再%Mod(具体请看代码中,已经标记出来了)

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std; #define ll long long//为了防止越界,统一全部用long long存
const ll Mod=1000000007; class Matrix//定义一个矩阵结构体
{
public:
ll A[2][2];
Matrix()//初始化。为了方便下面的运算,这里定义两种初始化,一种是直接全部为0,另一种是用一个二维数组给定其初值
{
memset(A,0,sizeof(A));
}
Matrix(ll arr[2][2])
{
for (int i=0;i<2;i++)
for (int j=0;j<2;j++)
A[i][j]=arr[i][j];
}
}; Matrix operator * (Matrix A,Matrix B)//重载乘法运算
{
Matrix Ans;
for (int i=0;i<2;i++)
for (int j=0;j<2;j++)
for (int k=0;k<2;k++)
Ans.A[i][j]=(Ans.A[i][j]+(A.A[i][k]*B.A[k][j]+Mod)%Mod+Mod)%Mod;//注意这里的取膜操作,防止了负数越界
return Ans;
} int main()
{
ll x,y,n;
cin>>x>>y>>n;
x=(x+Mod)%Mod;//这里因为x和y再输入的时候就有可能是负数(比如样例2),所以先取一次膜
y=(y+Mod)%Mod;
if (n==1)//n为1和2的时候直接输出
{
cout<<x<<endl;
return 0;
}
if (n==2)
{
cout<<y<<endl;
return 0;
}
ll a[2][2]={{y,x},{0,0}};
ll b[2][2]={{1,1},{-1,0}};
Matrix A(a);
Matrix B(b);
n=n-2;//这里要-2是因为1和2的已经处理了,现在只要乘以n-2次
while (n!=0)//矩阵快速幂
{
if (n&1)
A=A*B;
B=B*B;
n=n>>1;
}
cout<<A.A[0][0]<<endl;
return 0;
}

CodeForces 450B Jzzhu and Sequences (矩阵优化)的更多相关文章

  1. CodeForces - 450B Jzzhu and Sequences —— 斐波那契数、矩阵快速幂

    题目链接:https://vjudge.net/problem/CodeForces-450B B. Jzzhu and Sequences time limit per test 1 second ...

  2. CodeForces 450B Jzzhu and Sequences 【矩阵快速幂】

    Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, ple ...

  3. CodeForces 450B Jzzhu and Sequences(矩阵快速幂)题解

    思路: 之前那篇完全没想清楚,给删了,下午一上班突然想明白了. 讲一下这道题的大概思路,应该就明白矩阵快速幂是怎么回事了. 我们首先可以推导出 学过矩阵的都应该看得懂,我们把它简写成T*A(n-1)= ...

  4. CodeForces 450B Jzzhu and Sequences

    矩阵快速幂. 首先得到公式 然后构造矩阵,用矩阵加速 取模函数需要自己写一下,是数论中的取模. #include<cstdio> #include<cstring> #incl ...

  5. codeforces 450B. Jzzhu and Sequences 解题报告

    题目链接:http://codeforces.com/problemset/problem/450/B 题目意思:给出 f1 和 f2 的值,以及n,根据公式:fi = fi-1 + fi+1,求出f ...

  6. CodeForces 450B Jzzhu and Sequences 费波纳茨数列+找规律+负数MOD

    题目:Click here 题意:给定数列满足求f(n)mod(1e9+7). 分析:规律题,找规律,特别注意负数取mod. #include <iostream> #include &l ...

  7. codeforces 450B B. Jzzhu and Sequences(矩阵快速幂)

    题目链接: B. Jzzhu and Sequences time limit per test 1 second memory limit per test 256 megabytes input ...

  8. 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, ple ...

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

    题目链接:http://codeforces.com/problemset/problem/450/B 题意很好懂,矩阵快速幂模版题. /* | 1, -1 | | fn | | 1, 0 | | f ...

随机推荐

  1. 20155239吕宇轩 Exp1 PC平台逆向破解(5)M

    20155239 网络对抗 Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程器 (1分) ...

  2. [BZOJ4842]Delight for a Cat[费用流]

    题意 题目链接 分析 类似 最长k可重区间集 一题. 由于本题区间长度相同,首先可以将点的影响看成区间,区间看成点. 先默认所有位置选择事件2,选择区间看做改选事件1 .于是问题变成了求收益最大的方案 ...

  3. [C#]使用Label标签控件模拟窗体标题的移动及窗体颜色不断变换

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...

  4. 深入了解Kubernetes REST API的工作方式

    关于Kubernetes REST API的工作方式: 在哪里以及如何定义从REST路径到处理REST调用的函数的映射? 与etcd的交互发生在哪里? 从客户端发出请求到保存在etcd中对象的端到端路 ...

  5. jmeter实战1

  6. Istio全景监控与拓扑

    根据Istio官方报告,Observe(可观察性)为其重要特性.Istio提供非侵入式的自动监控,记录应用内所有的服务. 我们知道在Istio的架构中,Mixer是管理和收集遥测信息的组件.每一次当请 ...

  7. PAT-1004 Counting Leaves

    1004 Counting Leaves (30 分) A family hierarchy is usually presented by a pedigree tree. Your job is ...

  8. 跟踪分析Linux内核的启动过程小解

    跟踪分析Linux内核的启动过程 “20135224陈实  + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...

  9. python3 selenium打开Chrome报错闪退问题

    ChromeDriver不匹配 Google Chrome 已是最新版本 版本 64.0.3282.186(正式版本) (32 位)   ChromeDriver应该选择2.35 下载链接:https ...

  10. VS2013安装及测试

    一.Visual Studio的安装 首先是Visual Studio英文版的安装,安装完成后,为了用的时候方便,我从官网下载Visual Studio 2013的语言包并安装. 二.进行单元测试. ...