COJ 1208 矩阵快速幂DP
题目大意:
f(i) 是一个斐波那契数列 , 求sum(f(i)^k)的总和
由于n极大,所以考虑矩阵快速幂加速
我们要求解最后的sum[n]
首先我们需要思考
sum[n] = sum[n-1] + f(i+1)^k
那么很显然sum[n-1]是矩阵中的一个元素块
那么f(i+1)^k怎么利用f(i) , f(i-1)来求
f(i+1)^k = (f(i) + f(i-1)) ^ k
假如k = 1 , 可以看出f(i+1) = f(i-1) + f(i) (1,1)
k = 2 , 可以看出f(i+1)^2 = f(i-1)^2 + 2*f(i-1)*f(i) + f(i)^2 (1 , 2 , 1)
后面只列出前面的因子 k=3 1 , 3 , 3 , 1
k =4 1, 4 ,6,4,1
很容易看出后一行的数是由前一行的数当前列和前一列的相加
那么这里要放入矩阵中思考的就是 f(i-1)^k , f(i-1)^(k-1)*f(i) ...... f(i)^k , sum[i] 这样 k+2 个元素
那么做矩阵快速幂就是利用f(i-1)^k , f(i-1)^(k-1)*f(i) ...... f(i)^k , sum[i] 乘以某一个矩阵得到
f(i)^k , f(i)^(k-1)*f(i+1) ...... f(i+1)^k , sum[i+1]
自己一个个递推就会渐渐利用上述的关系轻松得到这个矩阵
#include <cstdio>
#include <cstring> using namespace std;
#define N 100
#define ll long long
const int MOD = ;
int n , k , l;
int num[N]; struct Matrix{
int a[N][N];
Matrix operator*(const Matrix &m) const{
Matrix ans ;
for(int i= ; i<l ; i++){
for(int j= ; j<l ; j++){
ans.a[i][j] = ;
for(int k= ; k<l ; k++){
ans.a[i][j] += ((ll)a[i][k] * m.a[k][j])%MOD;
ans.a[i][j] %= MOD;
}
}
}
return ans;
}
}st; Matrix q_pow(Matrix b , int t)
{
Matrix ans;
memset(ans.a , , sizeof(ans));
for(int i= ; i<l ; i++) ans.a[i][i] = ;
while(t)
{
if(t&) ans = ans*b;
b = b*b;
t>>=;
}
return ans;
} void build_matrix()
{
memset(st.a , , sizeof(st.a));
st.a[l-][] = ;
for(int i= ; i<l- ; i++){
for(int j=l- , t= ; t<=i ; t++,j--){
st.a[j][i] = st.a[j][i-]+st.a[j+][i-];
}
}
for(int i= ; i<l- ; i++)
st.a[i][l-] = st.a[i][l-];
st.a[l-][l-] = ;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in" , "r" , stdin);
#endif // ONLINE_JUDGE
int T;
scanf("%d" , &T);
while(T--)
{
scanf("%d%d" , &n , &k);
l = k+;
build_matrix();
for(int i= ; i<l- ; i++){
num[i] = ;
}
num[l-] = ;
if(n<=) printf("%d\n" , n);
else{
Matrix ans = q_pow(st , n-);
int ret = ;
for(int i= ; i<l ; i++){
ret += num[i]*ans.a[i][l-]%MOD;
ret %= MOD;
}
printf("%d\n" , ret);
}
}
return ;
}
COJ 1208 矩阵快速幂DP的更多相关文章
- codeforces 691E 矩阵快速幂+dp
传送门:https://codeforces.com/contest/691/problem/E 题意:给定长度为n的序列,从序列中选择k个数(可以重复选择),使得得到的排列满足xi与xi+1异或的二 ...
- P1357 花园 (矩阵快速幂+ DP)
题意:一个只含字母C和P的环形串 求长度为n且每m个连续字符不含有超过k个C的方案数 m <= 5 n <= 1e15 题解:用一个m位二进制表示状态 转移很好想 但是这个题是用矩阵快速 ...
- BZOJ1009 矩阵快速幂+DP+KMP
Problem 1009. -- [HNOI2008]GT考试 1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: ...
- Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP
题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...
- Codeforces 954 dijsktra 离散化矩阵快速幂DP 前缀和二分check
A B C D 给你一个联通图 给定S,T 要求你加一条边使得ST的最短距离不会减少 问你有多少种方法 因为N<=1000 所以N^2枚举边数 迪杰斯特拉两次 求出Sdis 和 Tdis 如果d ...
- Codeforces 989E A Trance of Nightfall 矩阵快速幂+DP
题意:二维平面上右一点集$S$,共$n$个元素,开始位于平面上任意点$P$,$P$不一定属于$S$,每次操作为选一条至少包含$S$中两个元素和当前位置$P$的直线,每条直线选取概率相同,同一直线上每个 ...
- BZOJ1009: [HNOI2008]GT考试 (矩阵快速幂 + DP)
题意:求一个长度为n的数字字符串 (n <= 1e9) 不出现子串s的方案数 题解:用f i,j表示长度为i匹配到在子串j的答案 用kmp的失配函数预处理一下 然后这个转移每一个都是一样的 所以 ...
- bzoj2004 矩阵快速幂优化状压dp
https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...
- 瓷砖铺放 (状压DP+矩阵快速幂)
由于方块最多涉及3行,于是考虑将每两行状压起来,dfs搜索每种状态之间的转移. 这样一共有2^12种状态,显然进行矩阵快速幂优化时会超时,便考虑减少状态. 进行两遍bfs,分别为初始状态可以到达的状态 ...
随机推荐
- 用户名密码登录小程序及input与raw_input区别。
一.此次程序需要实现: 1.设定固定的用户名密码 2.用户名密码输入正确打印登录正确信息 3.仅仅运行三次登录 二.本次使用的python版本为: Windows下版本号: C:\Users\dais ...
- archsummit_bj2014
http://bj2014.archsummit.com/schedule.html 大会日程 时间 2014年12月19日 会议室 二号会议厅 7:45 入场注册 8:45 开场致辞 9:30 论高 ...
- 使用真正的 Redux 和 React-redux
现在 make-react-redux 工程代码中的 Redux 和 React-redux 都是我们自己写的,现在让我们来使用真正的官方版本的 Redux 和 React-redux. 在工程目录下 ...
- JavaScript禁止键入非法值,只有这些才能被键入
JavaScript禁止键入非法值,只有这些才能被键入(k==9)||(k==13)||(k==46)||(k==8)||(k==189)||(k==109)||(k==190)||(k==110)| ...
- 外文翻译 《How we decide》多巴胺的预言 第一节
这是第二章的起始... 书的导言 1991年2月24日凌晨.第一与第二海军陆战队大批向北进入了沙特阿拉伯的沙漠地带,他们从这来进入科威特.这批军队是伊拉克入侵8个月以来,同盟国第一批进入科威特的部队. ...
- H+后台主题UI框架---整理(三)
这里面介绍下H+后台主题UI框架里面插件的应用,不过都是最最简单最初级的功能.主要有日历插件,input单选多选(icheck)插件,input下拉搜索(chosen)插件. 一.日历插件 有如下几种 ...
- 【学习笔记】HTML position(static、fixed、relative、absolute)
[本文转载] position的四个属性值:static.fixed.relative.absolute 下面分别讲述这四个属性:<div id="parent"> ...
- Makefile介绍
make 工具如 GNU make.System V make 和 Berkeley make 是用来组织应用程序编译过程的基本工具,但是每个 make 工具之间又有所不同.不同的make工具的mak ...
- 项目中常用git命令操作指令(一般正常的话够用不够再看相关git命令)
配置git1.首先在本地创建ssh key:ssh-keygen -t rsa -C "github上注册的邮箱" //(一路回车)2.进入c:/Users/xxxx_000/.s ...
- slides 在线ppt && React && Angular
现在主流前端框架 有3个 Vue React Angular 如果有时间就都学习,理解一下他们的差异性~ 在线ppt的一个网站 这个是npm讲解的,不错 https://slides.com/seld ...