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,分别为初始状态可以到达的状态 ...
随机推荐
- XSS漏洞解析(二)
上篇我们讲了XSS的一些相关的内容,这篇我们就直接上代码demo解决实际问题吧. 主要的问题是xssfilter的编写,我们直接去网上找一下框架,一般有js,php,java等语言都有相关的XSS的相 ...
- P1597 语句解析
题目背景 木有背景…… 题目描述 一串(<255)PASCAL语言,只有a,b,c 3个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,未赋值的变量值为0.输出a,b,c 最终的值. ...
- new几种用法
在 C# 中,new 关键字可用作运算符.修饰符或约束. new 运算符 用于创建对象和调用构造函数. new 修饰符 用于向基类成员隐藏继承成员. new 约束 用于在泛型声明中约束可能用作类型参数 ...
- 基于udp协议的套接字及udp协议粘包问题
udp协议的套接字 udp协议传输 服务端和客户端没有建立连接一说. import socket # 总结一下基础工作流程:服务端生成套接字并绑定ip_port,进入数据传输循环,服务端接受客户端发 ...
- Mac上面不能安装Homebrew
这个stackoverflow的答案解决了我的问题: http://stackoverflow.com/questions/18039029/mac-can-t-install-homebrew 问题 ...
- java nio 读取大文件
package com.yao.bigfile; import java.io.File; import java.io.IOException; import java.io.RandomAcces ...
- 洛谷 P1434 滑雪
题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...
- 实用工具特别推荐 BGInfo
https://docs.microsoft.com/en-us/sysinternals/downloads/bginfo 介绍 您在办公室中走过多少次,需要点击几个诊断窗口,提醒自己其配置的重要方 ...
- SAS Fuctions
1. monotonic(), 单调递增函数.返回一列变量的序列等,类似于_N_ . 2. index v indexw: INDEX Function Searches a character ex ...
- (转)使用Spring的注解方式实现AOP入门
http://blog.csdn.net/yerenyuan_pku/article/details/52865330 首先在Eclipse中新建一个普通的Java Project,名称为spring ...