第一次写博客,拿个矩阵快速幂练练手吧。

首先什么是快速幂,快速幂是让复杂度由线性降为log n的算法,比如8^1024次方暴力要算1024次,但是矩阵快速幂只算10次就好。

此题只不过是把快速幂的底数变为一个矩阵,矩阵乘法手写,然后计算矩阵的n次方的时候使用快速幂。

此题和矩阵n次方有什么关系?

我们先来构造如下矩阵A:

f2  0   0
f1  0   0
1   0   0
和另一个为矩阵B:
b   a   c
1   0   0
0   0   1

矩阵A每乘一次矩阵B,新矩阵第一个值便是递推公式的下一个值。

n的值为10^9,如果乘10^9个矩阵B必然会超时,所以使用快速幂,在中取模就好了(过程取模对乘法来说对结果无影响)。

理论上快速幂使用的时候最大的n能到2^(10^8)这么多。

代码如下:

 #include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define mod 1000007
#define ll long long struct matri
{
ll mat[][];
} one= {,,,,,,,,}; matri mul(matri a, matri b)
{
matri res;
for(int i=;i<;i++)
for(int j=;j<;j++)
{
res.mat[i][j] = ;
for(int k=;k<;k++)
{
res.mat[i][j] += a.mat[i][k] * b.mat[k][j];
res.mat[i][j] %= mod;
}
}
return res;
} matri pow(matri a, ll n)
{
matri res = one;
while(n != )
{
if(n & )
res = mul(res, a);
a = mul(a, a);
n >>= ;
}
return res;
} int main()
{
ll n,f1,f2,a,b,c,T;
matri tmp,arr;
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld%lld%lld%lld%lld",&f1,&f2,&a,&b,&c,&n);
if(n==)
printf("%lld\n",(f2-f1*b-c+mod)%mod);
if(n==)
printf("%lld\n",(f1+mod)%mod);
else if(n==)
printf("%lld\n",(f2+mod)%mod);
else
{
memset(arr.mat, , sizeof(arr.mat));
arr.mat[][] = f2;arr.mat[][] = f1; arr.mat[][] = ;
tmp.mat[][] = b; tmp.mat[][] = a; tmp.mat[][] = c;
tmp.mat[][] = tmp.mat[][] = ;
tmp.mat[][] = tmp.mat[][] = tmp.mat[][] = tmp.mat[][] = ;
matri p = pow(tmp, n-);
p = mul(p, arr);
ll ans = (p.mat[][] + mod) % mod;
printf("%lld\n",ans);
}
}
return ;
}

NYOJ 301 递推求值的更多相关文章

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

    递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的 ...

  2. NYOJ-301递推求值

    递推求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f ...

  3. 算法笔记_091:蓝桥杯练习 递推求值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n- ...

  4. Java实现 蓝桥杯 算法提高 递推求值

    算法提高 递推求值 时间限制:1.0s 内存限制:256.0MB 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) ...

  5. NYOJ301-递推求值

    递推求值 nyoj上矩阵专题里的10道题水了AC率最高的5道,惭愧,还不是完全自己写的,用了几乎两周的时间.模板题我是有自信写出来的,但对于高级一点的矩阵构造,我还是菜的抠脚. 这题感谢MQL大哥和她 ...

  6. nyoj--301--递推求值(经典矩阵运算)

    递推求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n ...

  7. poj 3744 Scout YYF I(递推求期望)

    poj 3744 Scout YYF I(递推求期望) 题链 题意:给出n个坑,一个人可能以p的概率一步一步地走,或者以1-p的概率跳过前面一步,问这个人安全通过的概率 解法: 递推式: 对于每个坑, ...

  8. poj 2096 Collecting Bugs 【概率DP】【逆向递推求期望】

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 3523   Accepted: 1740 ...

  9. nyoj 35-表达式求值(stack, 栈的应用)

    35-表达式求值 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:37 submit:53 题目描述: ACM队的mdd想做一个计算器,但是,他要做的 ...

随机推荐

  1. OC学习篇之---类的三大特性(封装,继承,多态)

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...

  2. BZOJ 4568: [Scoi2016]幸运数字(倍增+线性基)

    传送门 解题思路 异或最大值肯定线性基了,树上两点那么就倍增搞一搞,就维护每个点到各级祖先的线性基,时间复杂度\(O(nlog^3n)\),并不知道咋过去的. 代码 #include<iostr ...

  3. java中 抽象类和接口的区别

    一. 什么是抽象类及什么是抽象方法 抽象方法是一种特殊的方法:他只有声明,而没有具体实现,抽象方法的声明格式为: abstract void funName(); 抽象方法必须用 abstract 修 ...

  4. Linux下tomcat启动慢,阻塞

    声明:本文为转载,请尊重版权,原文地址: https://www.cnblogs.com/songjinju/p/7505564.html 这两天在linux部署完tomcat以后,发现每次启动都非常 ...

  5. dubbo超时原理以及解决方案

    dubbo超时原理以及解决方案 本篇主要记录dubbo中关于超时的常见问题,实现原理,解决的问题 超时问题 为了检查对dubbo超时的理解,尝试回答如下几个问题,如果回答不上来或者不确定那么说明此处需 ...

  6. LightOJ 1030 Discovering Gold (概率/期望DP)

    题目链接:LightOJ - 1030 Description You are in a cave, a long cave! The cave can be represented by a \(1 ...

  7. mysql与navicat应用

    下载安装配置 用法 1.连接本机数据库: 打开navicat选择连接---第一个mysql---在常规下自己明明连接名和密码----确定 我这边建立了本机测试库 2. 连接阿里云服务器上的mysql ...

  8. 力扣算法——133.CloneGraph【M】

    Given a reference of a node in a connected undirected graph, return a deep copy (clone) of the graph ...

  9. mysql中tinyint(1)与tinyint(2)的区别

    tinyint 型的字段如果设置为UNSIGNED类型,只能存储从0到255的整数,不能用来储存负数.tinyint 型的字段如果不设置UNSIGNED类型,存储-128到127的整数. 1个tiny ...

  10. 数据批量导入HBase

    测试数据: datas 1001 lilei 17 13800001111 1002 lily 16 13800001112 1003 lucy 16 13800001113 1004 meimei ...