NYOJ——301递推求值(矩阵快速幂)

递推求值

时间限制:1000 ms | 内存限制:65535 KB

难度:4

描述

给你一个递推公式:

f(x)=a*f(x-2)+b*f(x-1)+c

并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值。

注意:-1对3取模后等于2

输入

第一行是一个整数T,表示测试数据的组数(T<=10000)

随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值。

其中0<=f(1),f(2)<100,-100<=a,b,c<=100,1<=n<=100000000 (10^9)

输出

输出f(n)对1000007取模后的值

样例输入

2

1 1 1 1 0 5

1 1 -1 -10 -100 3

样例输出

5

999896

之前一直玩二维的,发现三维的矩阵也蛮容易构造的。新编辑器蛮好用。

代码:

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
const LL mod=1000007;
struct mat
{
    LL pos[3][3];
    mat(){memset(pos,0,sizeof(pos));}
};
inline mat operator*(const mat &a,const mat &b)
{
    int i,j,k;
    mat c;
    for (i=0; i<3; i++)
    {
        for (j=0; j<3; j++)
        {
            for (k=0; k<3; k++)
            {
                c.pos[i][j]+=(((a.pos[i][k])%mod)*(b.pos[k][j])%mod+mod)%mod;
            }
        }
    }
    return c;
}
inline mat matpow(mat a,LL b)
{
    mat r,bas;
    r.pos[0][0]=r.pos[1][1]=r.pos[2][2]=1;
    bas=a;
    while (b!=0)
    {
        if(b&1)
            r=r*bas;
        bas=bas*bas;
        b>>=1;
    }
    return r;
}
int main(void)
{
    ios::sync_with_stdio(false);
    LL a,b,c,n,f1,f2;
    int tcase;
    while (cin>>tcase)
    {
        while (tcase--)
        {
            cin>>f1>>f2>>a>>b>>c>>n;
            if(n==1)
                cout<<f1<<endl;
            else if(n==2)
                cout<<f2<<endl;
            else
            {
                mat t,one;
                t.pos[0][0]=b,t.pos[0][1]=a,t.pos[0][2]=c;
                t.pos[1][0]=t.pos[2][2]=1;
                one.pos[0][0]=f2,one.pos[1][0]=f1,one.pos[2][0]=1;
                t=matpow(t,n-2);
                one=t*one;
                cout<<one.pos[0][0]%mod<<endl;
            }
        }
    }
    return 0;
}
时间: 2024-11-06 13:52:37

NYOJ——301递推求值(矩阵快速幂)的相关文章

递推求值【快速幂矩阵】

递推求值 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2   输入 第一行是一个整数T,表示测试数据的组数(T<=10000)随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值.其中0<=f(1),f(2)<100,-100<=a,b,c<=100,1<=n<=10000000

2018ICPC焦作- Poor God Water 求递推式+矩阵快速幂

题目链接:https://nanti.jisuanke.com/t/31721 题意:一个孩子吃饭,有meat, fish 和 chocolate 三种食物可以选.要求连续三顿饭食物不能完全相同,鱼和肉的前一顿和后一顿不能都是巧克力,巧克力的左右两边不能同时出现鱼和肉. 思路:分九种情况,求出递推式,写出标准矩阵,用矩阵快速幂. 代码: #include <iostream> #include <stdio.h> #include <string.h> #define

【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. 在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论起了二叉搜索树.什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树.设key[p]表示结点p上的数值.对于其中的每个结点p,若其存在左孩子lch,则key

acdream 1060 递推数 (矩阵快速幂+循环节)

链接:click here~~ 题意: 递推数 Problem Description 已知A(0) = 0 , A(1) = 1 , A(n) = 3 * A(n-1) + A(n-2) (n ≥ 2)    求 A(A(A(A(N)))) Mod (1e9 + 7) Input 第一行一个整数 T (T ≤ 10000) 代表数据组数 每组数据占一行,一个整数 n (1 ≤ n ≤ 1e12) Output 对于每组测试数据输出一个整数. Sample Input 4 1 23574 278

题目1081:递推数列 (矩阵快速幂解递推式)

题目1081:递推数列 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5885 解决:800 题目描述: 给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q.这里n >= 2. 求第k个数对10000的模. 输入: 输入包括5个整数:a0.a1.p.q.k. 输出: 第k个数a(k)对10000的模. 样例输入: 20 1 1 14 5 样例输出: 8359 来源: 2009年清华大学计算机研究生机试真题 1 #include<stdio.h> 2 #

递推 +二项式定理(矩阵快速幂)

https://nanti.jisuanke.com/t/A2060 题意:第一个数为f[1] = a ,f[2] = b . 递推式:f[n] = f[n-1] + 2*f[n-2] + n4 . 求f[n]%2147493647. 数据:N,a,b<231 #include<stdio.h> #include<string.h> #include<math.h> #include<queue> #include<algorithm> #

NYOJ-301递推求值

递推求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2 输入 第一行是一个整数T,表示测试数据的组数(T<=10000)随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值.其中0<=f(1),f(2)<100,-100<=

蓝桥杯 算法提高 递推求值

思路: 矩阵快速幂. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 typedef long long ll; 7 typedef vector<ll> vec; 8 typedef vector<vec> mat; 9 10 const int mod = 99999999; 11 12 mat mul(m

NYOJ 298 点的变换(矩阵快速幂)

点的变换 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 平面上有不超过10000个点,坐标都是已知的,现在可能对所有的点做以下几种操作: 平移一定距离(M),相对X轴上下翻转(X),相对Y轴左右翻转(Y),坐标缩小或放大一定的倍数(S),所有点对坐标原点逆时针旋转一定角度(R). 操作的次数不超过1000000次,求最终所有点的坐标. 提示:如果程序中用到PI的值,可以用acos(-1.0)获得. 输入 只有一组测试数据 测试数据的第一行是两个整数N,M,分别表示