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;
}
NYOJ——301递推求值(矩阵快速幂)的更多相关文章
- NYOJ 301 递推求值
		
第一次写博客,拿个矩阵快速幂练练手吧. 首先什么是快速幂,快速幂是让复杂度由线性降为log n的算法,比如8^1024次方暴力要算1024次,但是矩阵快速幂只算10次就好. 此题只不过是把快速幂的底数 ...
 - 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
		
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
 - hdu3483 A Very Simple Problem  非线性递推方程2   矩阵快速幂
		
题目传送门 题目描述:给出n,x,mod.求s[n]. s[n]=s[n-1]+(x^n)*(n^x)%mod; 思路:这道题是hdu5950的进阶版.大家可以看这篇博客hdu5950题解. 由于n很 ...
 - Luogu3824 [NOI2017]泳池 【多项式取模】【递推】【矩阵快速幂】
		
题目分析: 用数论分块的思想,就会发现其实就是连续一段的长度$i$的高度不能超过$\lfloor \frac{k}{i} \rfloor$,然后我们会发现最长的非$0$一段不会超过$k$,所以我们可以 ...
 - HDU4565 So Easy!  —— 共轭构造、二阶递推数列、矩阵快速幂
		
题目链接:https://vjudge.net/problem/HDU-4565 So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory L ...
 - NYOJ-301递推求值
		
递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f ...
 - 算法笔记_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- ...
 - Java实现 蓝桥杯 算法提高 递推求值
		
算法提高 递推求值 时间限制:1.0s 内存限制:256.0MB 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) ...
 - 【XSY2612】Comb Avoiding Trees 生成函数 多项式求逆 矩阵快速幂
		
题目大意 本题的满二叉树定义为:不存在只有一个儿子的节点的二叉树. 定义一棵满二叉树\(A\)包含满二叉树\(B\)当且经当\(A\)可以通过下列三种操作变成\(B\): 把一个节点的两个儿子同时删掉 ...
 
随机推荐
- springboot  测试
			
本次测试使用的是springboot 中的测试 1.(对service 的测试)下面的测试.将会启动容器进行测试 @RunWith(SpringRunner.class) @SpringBootTes ...
 - 八数码问题(一) 暴力BFS + STL
			
八数码问题是一个经典的人工智能问题.具体问题不累述了. 思路:由于存在多组测试数据,可以考虑“打表法“.所谓打表法,即枚举所有的初始情况,记录其到达终点的路径.而在这个题目中,顺序打表会调用很多次BF ...
 - javaweb基础(4)_http协议
			
一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...
 - nodejs安装遇到npm命令无法使用问题
			
解决方法: 在用户文件夹中建立npm文件夹就可以使用了. 再使用npm命令就可以了.
 - Url Rewrite  重写
			
前几天看到园子里一篇关于 Url 重写的文章<获取ISAPI_Rewrite重写后的URL>, URL-Rewrite 这项技术早已不是一项新技术了,这个话题也已经被很多人讨论过多次.搜索 ...
 - HTML DOM Frame 的 src
			
定义和用法 src 属性可设置或返回应当被载入框架中的文档的 URL. 该属性只是 HTML 的 <frame> 标记的一个对应,并不是 Window.location 这样的 Locat ...
 - Js笔记-第17课
			
课 // 作业 //深度拷贝 var obj = { name:'rong', age:'25', card:['visa','alipay'], nam :['1','2','3','4','4'] ...
 - 01_11_Strtus2简单数据验证
			
01_11_Strtus2简单数据验证 1. 引入struts标签 <%@taglib uri="/struts-tags" prefix="s" %&g ...
 - shell时间变量拼接问题
			
shell时间变量拼接问题 例1 ABC=ABC_`date –date='yesterday' "+%Y%m%d"`
 - [bzoj]1930 pacman吃豆豆
			
Description 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪,只能向右走或者向上走,他 ...