【矩阵快速幂 】Codeforces 450B - Jzzhu and Sequences (公式转化)

【题目链接】click here~~

【题目大意】

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

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

【解题思路】

/*A - Jzzhu and Sequences
Codeforces 450B - Jzzhu and Sequences ( 矩阵快速幂 )
给定f1和f2,求fn
分析:
特判f1,f2
当n>=3时使用矩阵快速幂即可
将公式转化一下 , 可以得到一个变换矩阵
由F(i)=F(i-1)+F(i+1);
 将左式移到右边得
  F(i+i)=F(i)-F(i-1);
下标同时减一得
  F(i)=F(i-1)-F(i-2);
从而构造矩阵
(F(i-1),F(i-2))*[1 -1 ]=(F(i),F(i-1))
                [1  0 ]
带入i=3,得
(F(2)=y,F(1)=x)*[1 -1 ]^(i-2)=(F(3),F(2))
                [1  0 ]
代码如下*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const long long  MOD=1e9+7;
#define LL long long
struct Matrlc
{
    long long  mapp[2][2];
} ans,base;
Matrlc unit={1,0,0,1};
Matrlc mult(Matrlc a,Matrlc b)
{
    Matrlc c;
    for(int i=0; i<2; i++)
        for(int j=0; j<2; j++)
        {
            c.mapp[i][j]=0;
            for(int k=0; k<2; k++)
                c.mapp[i][j]+=(a.mapp[i][k]*b.mapp[k][j])%MOD;
                c.mapp[i][j]%=MOD;
        }
    return c;
}
void pow1(LL n)
{
    base.mapp[0][0] =1;
    base.mapp[0][1] = -1;
    base.mapp[1][0] = 1;
    base.mapp[1][1] = 0;
    ans.mapp[0][0] = ans.mapp[1][1] = 1;// ans 初始化为单位矩阵
    ans.mapp[0][1] = ans.mapp[1][0] = 0;
    while(n)
    {
        if(n&1)   ans=mult(ans,base);
        base=mult(base,base);
        n>>=1;
    }
}
int main()
{
    LL X,Y,N,i,j;
    scanf("%lld%lld%lld",&X,&Y,&N);
    if(N==1) printf("%lld\n",(X%MOD+MOD)%MOD);
    else if(N==2) printf("%lld\n",(Y%MOD+MOD)%MOD);
    else
    {
        pow1(N-2);
        LL  result=(((ans.mapp[0][0]*Y+ans.mapp[0][1]*X)%MOD)+MOD)%MOD;
        printf("%lld\n",result);
    }
    return 0;
}
时间: 2024-10-14 00:02:59

【矩阵快速幂 】Codeforces 450B - Jzzhu and Sequences (公式转化)的相关文章

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

[递推+矩阵快速幂]Codeforces 1117D - Magic Gems

传送门:Educational Codeforces Round 60 – D 题意: 给定N,M(n <1e18,m <= 100) 一个magic gem可以分裂成M个普通的gem,现在需要N个gem,可以选择一定的magic gem,指定每一个分裂或不分裂,问一共有多少种方案 两种分裂方案不同当且仅当magic gem的数量不同,或者分裂的magic gem的索引不同. 思路: 1.首先从dp的角度出发 设F(i)为最终需要i个gem的方案数,容易得到递推式: (总方案数 = 最右边的m

CodeForces 450B Jzzhu and Sequences

矩阵快速幂. 首先得到公式 然后构造矩阵,用矩阵加速 取模函数需要自己写一下,是数论中的取模. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; long long MOD = 1e9 + 7; long long x, y; int n; long long mod(long l

[矩阵快速幂] CodeForces 392C Yet Another Number Sequence

题意: 题目意思很明朗~ 思路: A(n+1)=F(n+1)*(n+1)^k A(n)=F(n)*(n)^k A(n-1)=F(n-1)*(n-1)^k 这里拿k=2来举例 A(n+1)=F(n)*(n+1)^2+F(n-1)*(n+1)^2 对于A(n+1)发现可以由A(n)和A(n-1)得到 实际上就是多了 2*n+1个F(n) 和4*n个F(n-1) 其实就是n^k -> (n+1)^k  以及 (n-1)^k ->(n+1)^k 大家算一算就发现是和杨辉三角有关的,就是系数 这样我们就

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

题目:Click here 题意:给定数列满足求f(n)mod(1e9+7). 分析:规律题,找规律,特别注意负数取mod. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 const int M = 1e5+5; 8 const int

HDU 3117 Fibonacci Numbers(矩阵快速幂+公式)

题目地址:HDU 3117 对于后四位可以用矩阵快速幂快速求出来,但前四位就没办法了.要知道斐波那契数列是有通项公式的,所以只能通过通项公式来求前四位,但公式不能求后四位,因为公式使用浮点数求的,精度显然不够,求前四位要用到对数. 通项公式为: f(n)=1/sqrt(5)(((1+sqrt(5))/2)^n+((1-sqrt(5))/2)^n) 假设F[n]可以表示成 t * 10^k(t是一个小数),那么对于F[n]取对数log10,答案就为log10 t + K,此时很明显log10 t<

HDU5950-Recursive sequence(矩阵快速幂)

题目链接:Recursive sequence 题意:给出n头母牛,第一头报a,第二头报b,第i头报f[i-2]*2+f[i-1]+i^4,问第n头母牛报数多少 分析:N,a,b<2^31,果断矩阵快速幂,关键是要推出公式,公式如下,仅作参考 1 0 0 0 0 0 0        1               1 1 1 0 0 0 0 0        i                i+1 1 2 1 0 0 0 0       i2              (i+1)2 1 3

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 (矩阵快速幂)

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