题目大意:

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的更多相关文章

  1. codeforces 691E 矩阵快速幂+dp

    传送门:https://codeforces.com/contest/691/problem/E 题意:给定长度为n的序列,从序列中选择k个数(可以重复选择),使得得到的排列满足xi与xi+1异或的二 ...

  2. P1357 花园 (矩阵快速幂+ DP)

    题意:一个只含字母C和P的环形串 求长度为n且每m个连续字符不含有超过k个C的方案数 m <= 5  n <= 1e15 题解:用一个m位二进制表示状态 转移很好想 但是这个题是用矩阵快速 ...

  3. BZOJ1009 矩阵快速幂+DP+KMP

    Problem 1009. -- [HNOI2008]GT考试 1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: ...

  4. Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP

    题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...

  5. Codeforces 954 dijsktra 离散化矩阵快速幂DP 前缀和二分check

    A B C D 给你一个联通图 给定S,T 要求你加一条边使得ST的最短距离不会减少 问你有多少种方法 因为N<=1000 所以N^2枚举边数 迪杰斯特拉两次 求出Sdis 和 Tdis 如果d ...

  6. Codeforces 989E A Trance of Nightfall 矩阵快速幂+DP

    题意:二维平面上右一点集$S$,共$n$个元素,开始位于平面上任意点$P$,$P$不一定属于$S$,每次操作为选一条至少包含$S$中两个元素和当前位置$P$的直线,每条直线选取概率相同,同一直线上每个 ...

  7. BZOJ1009: [HNOI2008]GT考试 (矩阵快速幂 + DP)

    题意:求一个长度为n的数字字符串 (n <= 1e9) 不出现子串s的方案数 题解:用f i,j表示长度为i匹配到在子串j的答案 用kmp的失配函数预处理一下 然后这个转移每一个都是一样的 所以 ...

  8. bzoj2004 矩阵快速幂优化状压dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...

  9. 瓷砖铺放 (状压DP+矩阵快速幂)

    由于方块最多涉及3行,于是考虑将每两行状压起来,dfs搜索每种状态之间的转移. 这样一共有2^12种状态,显然进行矩阵快速幂优化时会超时,便考虑减少状态. 进行两遍bfs,分别为初始状态可以到达的状态 ...

随机推荐

  1. DNS练习之反向解析

    环境同正向解析一样. 切换到/var/named/chroot/etc目录下: 编辑named.rfc1912.zones文件,在末尾添加如下内容: [root@sishen63 etc]# vim ...

  2. LVS集群-DR模式

    同上个实验一样,还是准备三台机器 分发器(sishen_63):eth0 192.168.1.63 RealServer1sishen_64) RealServer2sishen_65) 首先配置网卡 ...

  3. 用NPOI从DataTable到Excel,向Excel模板填充数据

    DataTable---->Excel,填充数据 private IWorkbook workbook = null; private ISheet sheet = null; private ...

  4. AJPFX总结面向对象(this和super的区别和应用)

    面向对象(this和super的区别和应用)(掌握)* A:this和super都代表什么        * this:代表当前对象的引用,谁来调用我,我就代表谁        * super:代表当 ...

  5. poj2441 Arrange the Bulls

    思路: 状态压缩dp.需要一点优化,否则容易超时. 实现: #include <cstdio> #include <vector> #include <cstring&g ...

  6. Hibernate核心接口和工作原理

    Hibernate核心接口和工作原理 Hibernate有五大核心接口,分别是:Session .Transaction .Query .SessionFactory .Configuration . ...

  7. Ubuntu14.04 LTS安装 OpenCV-3.0.0-rc1 + QT5.4.1

    I 安装配置工作前的准备 2 II 安装 OpenCV 2 III 安装QT 3 IV 使QT能够使用OpenCV 3 如果顺利,整个过程应该3个小时左右能够完成. 我整个过程用了一早上,配置过程中有 ...

  8. 在Github上删除一个项目

    最近在Github上浏览,不小心fork了一个项目.想删除,现在记录下来. 1.点击选择fork的项目,以gubai为例 2.进入后,点击Settings 3.进入页面后,点击Delete this ...

  9. 算法之A星算法(寻路)

    1.启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省略大量无谓的搜索路径,提高了效率.在启发式搜索中,对位置的估价是十分 ...

  10. HYSBZ 1503 郁闷的出纳员 (Splay树)

    题意: 作为一名出纳员,我的任务之一便是统计每位员工的工资.但是我们的老板反复无常,经常调整员工的工资.如果他心情好,就可能把每位员工的工资加上一个相同的量.反之,如果心情不好,就可能把他们的工资扣除 ...