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

首先什么是快速幂,快速幂是让复杂度由线性降为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. mysql学习-join的使用

    sql的执行顺序是从from 开始 join图

  2. tomcat部署项目遇到的问题

    场景:在一台服务器上部署多个Tomcat,每个Tomcat下运行各自的项目 * )启动Tomcat startup.cmd报错: java.lang.Exception: Socket bind fa ...

  3. PHP基础知识总结(五) php面试题

    1.Ajax跨域 json:数据交换格式,{"name":"wangtianle"} jsonp:非官方跨域数据交换协议,可以通过动态添加<script/ ...

  4. eclipse run error:g++ not found in Path

    网上有人说: 在eclipse下 windows-->Preference-->C/C++-->Build-->Setting然后选择Discovery标签,将里面的内容全部R ...

  5. Windows-WAMP搭建与配置

    使用 WampServer 整合软件包进行 WAMP 环境搭建 WampServer 是一款由法国人开发的 Apache Web 服务器.PHP 解释器以及 MySQL 数据库的整合软件包.免去了开发 ...

  6. spring mvc 使用freemark配置

    直接在配置中加入 <mvc:annotation-driven/> <!--freemark--> <bean id="freemarkerConfig&quo ...

  7. 数据访问层的基类BaseDALSQL

    using System; using System.Text; using System.Collections; using System.Data; using System.Data.Comm ...

  8. Java 实例 - 方法重载

    先来看下方法重载(Overloading)的定义:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载. 具体说明如下: 方法名相同 方法的参数类型,个数顺序至少有一项不同 ...

  9. fedora 25重新安装引导

    引导区被其他系统给覆盖了,重新安装引导 grub2-install /dev/sdb GRUB_SAVEDEFAULT=true BIOS grub2-mkconfig -o /boot/grub2/ ...

  10. js系列教程11-json、ajax(XMLHttpRequest)、comet、SSE、WebSocket全解

    js系列教程11-json.ajax(XMLHttpRequest).comet.SSE.WebSocket全解:https://blog.csdn.net/luanpeng825485697/art ...