HDU1588
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1588
题目大意:g(i)= k * i + b. 给定 k 和 b,求0 <= i < n 的斐波那契数 F(g(i))的和模1,000,000,000.
解题思路:
矩阵快速幂再加上二分矩阵公式。
首先,我们需要认识到的一点是:对于这种求斐波那契数的题,很多都是用矩阵快速幂根据如下公式来计算的。

我们在此把中间那个0\1矩阵设为A。要求 The_Sum_of_F(g(i)),只需求出 A^(g(0)-1) + A^(g(1)-1) + A^(g(2)-1) + ... + A^(g(n-1)-1) = A^(b-1) + A^(i+b-1) + A^(2*i+b-1) + ...... = A^(b-1) + A^(b-1) * (A^i + A^(2*i) + A^(3*i) + ......). A^(b-1) = Ab, A^i = Ai,这些都可以用矩阵快速幂求出来。那么式子就变成:Ab+Ab * (Ai + Ai^2 + Ai^3 + ......).加粗的那部分用二分矩阵公式递归求出。下面给出二分矩阵公式的一个例子:A^1+A^2+A^3+A^4+A^5+A^6=(A^1+A^2+A^3)+A^3(A^1+A^2+A^3)。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn = ;
struct Matrix {
ll mat[][];
};
Matrix E;
ll M;
Matrix Multiply(Matrix x,Matrix y) {
Matrix temp;
memset(temp.mat, , sizeof(temp.mat));
for (int i = ; i < ; i++)
for (int j = ; j < ; j++) {
for (int k = ; k < ; k++) {
temp.mat[i][j] += (x.mat[i][k] * y.mat[k][j]%M);
temp.mat[i][j]%=M;
}
}
return temp;
}
Matrix Add(Matrix x,Matrix y){
Matrix temp;
for (int i = ; i < ; i++){
for (int j = ; j < ; j++) {
temp.mat[i][j]=(x.mat[i][j]+y.mat[i][j])%M;
}
}
return temp;
}
Matrix Fast_Power(Matrix a, int m) { //求a的m次幂
Matrix res;
memset(res.mat, , sizeof(res.mat));
for (int i = ; i < ; i++) res.mat[i][i] = ;
while (m) {
if (m & ) res = Multiply(res, a);
m >>= ;
a = Multiply(a, a);
}
return res;
}
Matrix Binary_add(Matrix B,int t){
if(t==) return B;
if(t%==){
return Add(Multiply(Binary_add(B,(t-)/),Add(E,Fast_Power(B,(t-)/))),Fast_Power(B,t));
}
else
return Multiply(Binary_add(B,t/),Add(E,Fast_Power(B,t/)));
}
int main()
{
E.mat[][]=E.mat[][]=;
E.mat[][]=E.mat[][]=;
Matrix A;
A.mat[][]=A.mat[][]=A.mat[][]=;
A.mat[][]=;
ll k,b,n,t;
while(scanf("%lld%lld%lld%lld",&k,&b,&n,&M)==){
Matrix Ab,B,ans;
B=Fast_Power(A,k);
Ab=Fast_Power(A,b);
ans=Add(Ab,Multiply(Ab,Binary_add(B,n-)));
printf("%lld\n",ans.mat[][]);
}
return ;
}
HDU1588的更多相关文章
- hdu1588 矩阵快速幂
//看了很多的博客 后来队友指点才懂//sum=f(g(0))+f(g(1))+.... //sum=A^(b-1)*|...|.... //要将b-1换,防止出现b=0时有负一,用A^b代替,取下面 ...
- hdu1588之经典矩阵乘法
Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu1588:Gauss Fibonacci
对每个0<=i<n求f(g(i))的和,其中f(x)为斐波那契数列第x项,g(i)=k*i+b,k,b,n给定,模数给定. 斐波那契数有一种用矩阵乘法求的方法,这个矩阵A自己写,令F[i] ...
- POJ3233]Matrix Power Series && [HDU1588]Gauss Fibonacci
题目:Matrix Power Series 传送门:http://poj.org/problem?id=3233 分析: 方法一:引用Matrix67大佬的矩阵十题:这道题两次二分,相当经典.首先我 ...
- hdu1588---Gauss Fibonacci(矩阵,线性复发)
根据题意:最后一步是寻求f(b) + f(k + b) + f(2 * k + b) + -+ f((n-1) * k + b) 清除f(b) = A^b 间A = 1 1 1 0 所以sum(n - ...
- 【POJ】3233 Matrix Power Series
[算法]二分+矩阵快速幂 [题意]给定矩阵A和整数k,MOD,求A^0+A^1+A^2+...+A^k. [题解] 定义题目要求的答案为f(n),即: $$f_n=\sum_{i=0}^{n}A^i$ ...
随机推荐
- Linux系统目录结构:目录层次标准、常用目录和文件
1. 目录层次标准FHS FHS(Filesystem Hierarchy Standard)目录层次标准,是Linux的目录规范标准. FHS定义了两层规范: 第一层:是"/" ...
- Flutter仿网易云音乐:播放界面
写在前头 本来是要做一个仿网易云音乐的flutter项目,但是因为最近事情比较多,项目周期跨度会比较长,因此分几个步骤来完成.这是仿网易云音乐项目系列文章的第一篇.没有完全照搬网易云音乐的UI,借鉴了 ...
- jmeter的教学视频
转载于:https://www.cnblogs.com/ios9/p/9769058.html
- [译] React 16.3(.0-alpha) 新特性
原文地址:What's new in React 16.3(.0-alpha) 原文作者:Bartosz Szczeciński 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/ ...
- 导入sql错误
2019独角兽企业重金招聘Python工程师标准>>> 导入sql错误: This function has none of DETERMINISTIC, NO SQL, or RE ...
- poj1679 The Unique MST(最小生成树唯一性)
最小生成树的唯一性,部分参考了oi-wiki 如果一条不在最小生成树边集内的边,它可以替换一条在最小生成树边集内,且权值相等的边,那么最小生成树不是唯一的 同过kruskal来判断 考虑权值相等的边, ...
- CF1328B K-th Beautiful String
CF1328B K-th Beautiful String,然而CF今天却上不去了,这是洛谷的链接 题意 一个长度为\(n\)的字符串,有2个\(\texttt{b}\)和\(n-2\)个\(\tex ...
- CF1316C Primitive Primes
CF1316C [Primitive Primes] 给出两个多项式\(a_0+a_1x+a_2x^2+\dots +a_{n-1}x^{n-1}\)和\(b_0+b_1x+b_2x^2+ \dots ...
- linux下编译boost的多线程程序
linux下面用boost库进行多线程编程,一开始总是编译不成功,花了好多的时间. 下面是一段小示例代码: //start from the very beginning,and to create ...
- N - Marriage Match II 网络流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3081 推荐博客:https://www.cnblogs.com/liuxin13/p/4728131. ...