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,分别为初始状态可以到达的状态 ...
随机推荐
- Altium Designer的一些功能
一 Snippets:将原理图或PCB的部分模块电路保存以便于以后重用.https://wenku.baidu.com/view/412a0dbcf121dd36a32d8217.html 二 设备制 ...
- Error: IO_ERROR : java.io.IOException: Error while connecting Oozie server. No of retries = 5. Exception = Connection refused (Connection refused)解决办法(图文详解)
不多说,直接上干货! 问题详情 解决办法 Copy/Paste oozie.services property tag set from oozie-default.xml to oozie-site ...
- markdown快捷键(转)
markdown快捷键 GLYPH NAME COMMAND Command, Cmd, Clover, (formerly) Apple ALT Option, Opt, (Windows) Alt ...
- 序列化json模块
1.用json模块来进行序列化和反序列化 注意:用json序列化的数据类型得到的文件后缀名必须是json.因为如果不是json后缀,别人也不知道这是用json序列化的文件. 序列化:json.dump ...
- 基于 Web 的 Go 语言 IDE - Wide 1.5.0 发布!
Wide 是什么 Wide 是一个基于 Web 的 Go 语言团队 IDE. 在线开发:打开浏览器就可以进行开发.全快捷键 智能提示:代码自动完成.查看表达式.编译反馈.Lint 实时运行:极速编译. ...
- asp.net 中文部分显示问号
很神奇的事情,今天部署了一个网站,页面从数据读取新闻后,有些新闻标题全部显示问题号,有几个新闻能正确显示汉字,然后查看新闻页面又能正常显示汉字. 解决办法: 在异常的页面上加上 < %@ COD ...
- Math.net,.net上的科学计算利器
F#在科学计算领域的应用,包括部分语法介绍. Math.net,.net上的科学计算利器 摘要: .net上科学计算个人觉得首选numpy和scipy for dotnet.因为这两个库用户数量已经非 ...
- ICEcoder显示汉字出现乱码的处理
在网上看到icecoder这个小东西,是一个基于web的编辑器,很不错.唯一的缺点是打开的文件中汉字会变成乱码. 经查看源代码,在lib/file-control.php中,第89行是: echo ' ...
- Android(java)学习笔记161:开发一个多界面的应用程序之人品计算器的简单实现
1.开启新的Activity的方法: (1)Intent 意图 (2)intent.setAction("自定义") 记得在清单文件中声明 (3)intent.setData(前 ...
- vue 模块 props
inbody.vue <template> <div> <Breadcrumb :style="{margin: '24px 0'}"> < ...