递推求值

nyoj上矩阵专题里的10道题水了AC率最高的5道,惭愧,还不是完全自己写的,用了几乎两周的时间。模板题我是有自信写出来的,但对于高级一点的矩阵构造,我还是菜的抠脚。

这题感谢MQL大哥和她女票指点,自己想了一天不会构造矩阵,然后两位巨巨一起讨论了一下,瞬间明白了。此题关键就是在于这个矩阵构造。

题意:给出M斐波那契的前两项f[1],f[2],以及递推式:f(x)=a*f(x-2)+b*f(x-1)+c
中的a,b,c,和n.求f[n]%1000007。

很裸的矩阵快速幂,但怎么构造这个矩阵呢。摘用远航学长的博客来解释吧:

分析:由于n的值比较大,所以常规方法肯定会超时。根据递推式求第n个表达式的值时,通常用矩阵乘法来做。

本题要构造两个矩阵,其中一个为矩阵A,作为初始矩阵

即:假设初始矩阵为A,那么每次都需要乘以下一个矩阵B来得到下一项。

而:f[n]=a*f[n-2]+b*f[n-1]+c,f[n-1]=1*f[n-1]+0*f[n-2]+0*c,c=0*f[n-1]+0*f[n-2]+1*c;

A

| f2  0   0  |

| f1  0   0  |

| 1   0   0  |

B

| b   a   c |

| 1   0   0 |

| 0   0   1 |



  因为F(2)和F(1)是已知的,当n>=3时,每次都乘以矩阵B,就能推出下一个矩阵。而矩阵的第一行第一列的元素就是所求的结果。

所以利用矩阵快速幂能够快速准确地求出结果。

由以上就可以很快得出结果了:

const ll MOD=1e6+7;
const int N=1e3+10;
ll x1,x2,aa,bb,cc,n;
struct mat
{
ll a[3][3];
};
mat mat_mul(mat x,mat y)
{
mat res;
memset(res.a,0,sizeof(res.a));
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
for(int k=0; k<3; k++)
res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j])%MOD;
return res;
}
mat mat_fast_pow(mat x,ll k)
{
mat res;
memset(res.a,0,sizeof(res.a));
for(int i=0; i<3; i++) res.a[i][i]=1;
while(k)
{
if(k&1) res=mat_mul(res,x);
x=mat_mul(x,x);
k=k>>1;
}
return res;
}
void solve()
{
mat B,A;//
memset(B.a,0,sizeof(B.a));
memset(A.a,0,sizeof(A.a));
B.a[0][0]=bb,B.a[0][1]=aa,B.a[0][2]=cc;//构造B矩阵;
B.a[1][0]=B.a[2][2]=1;
A.a[0][0]=x2,A.a[1][0]=x1,A.a[2][0]=1;//构造初始矩阵A,注意顺序
B=mat_fast_pow(B,n-2);//矩阵快速幂
mat ans=mat_mul(B,A);//相乘
printf("%lld\n",ans.a[0][0]);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld%lld%lld%lld%lld",&x1,&x2,&aa,&bb,&cc,&n);
if(aa<0) aa+=MOD;//注意数据范围和题目要求;
if(bb<0) bb+=MOD;
if(cc<0) cc+=MOD;
if(n==1)//特判1和2的情况
{
printf("%lld\n",x1);
continue;
}
if(n==2)
{
printf("%lld\n",x2);
continue;
}
solve();
}
return 0;
}

NYOJ301-递推求值的更多相关文章

  1. NYOJ-301递推求值

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

  2. 算法笔记_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- ...

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

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

    第一次写博客,拿个矩阵快速幂练练手吧. 首先什么是快速幂,快速幂是让复杂度由线性降为log n的算法,比如8^1024次方暴力要算1024次,但是矩阵快速幂只算10次就好. 此题只不过是把快速幂的底数 ...

  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. HDU 5446——Unknown Treasure——————【CRT+lucas+exgcd+快速乘+递推求逆元】

    Each test case starts with three integers n,m,k(1≤m≤n≤1018,1≤k≤10) on a line where k is the number o ...

随机推荐

  1. [已读]响应式web设计

    去年冲着响应式这三个字买的,很快就读完了,因为说实话都挺浅显的内容.真正涉及到响应式的是第二和第三章(媒体查询 em 百分比图片),其他的h5与css3关系不大.

  2. Spring Cloud Config 使用Bus的动态配置中心

    server端配置 POM文件 <dependency> <groupId>org.springframework.boot</groupId> <artif ...

  3. laravel关联用户

    参考文档:模型关联-反向关联 belongsToor 模型层 app/Post.php public function user() { return $this->belongsTo('\Ap ...

  4. centos系统iptables使用帮助

    #如果只是想屏蔽IP的话“开放指定的端口”可以直接跳过.#屏蔽单个IP的命令是iptables -I INPUT -s 123.45.6.7 -j DROP#封整个段即从123.0.0.1到123.2 ...

  5. 开启server-status失败

    近日在配置监控宝的apache监控老是出错,经过研究发现如下: 下面先做一些简要的介绍,以防以后查看之用. 一.server-status是什么?二.如何打开server-status?三.serve ...

  6. 洛谷 P2153 [SDOI2009]晨跑

    题目描述 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街 ...

  7. raid 0 1 5 10 总结的知识点

    raid 0 1 5 10 raid 发的别名条带 raid 0 读取性能最高需要磁盘2*N个(N>0)代表所有raid级别中的最高存储性能,其实原理就是把连续的数据分散到多个磁盘上存取,这样, ...

  8. About App Sandbox

    沙盒是在受限的安全环境中运行应用程序的一种做法,这种做法是要限制授予应用程序的代码访问权限. 沙盒技术提供对资源的严格控制,沙盒通过限制对内存.系统文件和设置的访问,沙盒可以让企业可通过执行潜在恶意代 ...

  9. hdu6290 奢侈的旅行

    最短路算法的复杂度考虑! 书上已经做了优化,用的是优先队列:用优先队列实现堆优化 V为点集,E为边集 从O(V^2)优化到O(ElogV) 然后再记忆一下inf 0x3f3f3f3f的十进制是1061 ...

  10. uva11491 Erasing and Winning

    边读入边处理 优化了速度一开始有想错了的地方.处理输入有点想用stringstream, 的问题在于他把字符串连续的数字作为一个整体,遇到空格才分开,所以不适用 #include<cstdio& ...