题目大意:

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. RHEL6.5、RHEL7.2忘记ROOT密码恢复小结

    RHEL6.5忘记root密码恢复步骤 RHEL7.2恢复密码步骤 5.耐心等待重启完成即可实现重置root密码 也可以按如下做法 依次执行chroot /sysroot/,passwd===> ...

  2. C#基础学习1

    开发入门,最基础的学习!

  3. 【学习笔记】HTML position(static、fixed、relative、absolute)

    [本文转载] position的四个属性值:static.fixed.relative.absolute 下面分别讲述这四个属性:<div id="parent">   ...

  4. Android获取本地相册图片、拍照获取图片

    需求:从本地相册找图片,或通过调用系统相机拍照得到图片. 容易出错的地方: 1,当我们指定了照片的uri路径,我们就不能通过data.getData();来获取uri,而应该直接拿到uri(用全局变量 ...

  5. IE8 window.open 不支持此接口 的问题解决

    在使用vs2010调试代码时,突然出现 window.open 不支持此接口的提示,开始认为是不是vs的问题,后来上网查询说是系统问题.我不想重装系统,之后发现是IE的问题,使用其他浏览器浏览系统不会 ...

  6. 工作中Docker使用命令笔记

    docker安装与启动 安装docker [root@localhost /]# yum -y install docker-io 更改配置文件 [root@localhost /]# vi /etc ...

  7. 光线步进——RayMarching入门

    入门实现 先用RayMarching描绘一个球体,最后在进行光照计算参考:https://www.shadertoy.com/view/llt3R4 模拟摄像机射线float3 rayDirectio ...

  8. 我的app自动化实战练习一

    ''' -*- coding: utf-8 -*- @Time : 2019/6/10 0010 10:39 @Author : 无邪 @File : test_data.py @Software: ...

  9. Python基础2 列表 元祖 字符串 字典 集合 文件操作 -DAY2

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  10. pooling需要注意的一个地方

    max pooling 在不同的 depth 上是分开执行的,且不需要参数控制.也就是说,pooling之后,feature map的维度不会改变