题目链接: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 ;
}

最新文章

  1. 解决EditText和ScrollView滑动冲突问题
  2. jquery ripples水波纹效果( 涟漪效果)
  3. windbg命令----!idt
  4. libreoffice安装
  5. 拦路虎:jQuery
  6. IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol)。
  7. C#子线程刷新界面并关闭窗体
  8. 未在本地计算机上注册&quot;Microsoft.Jet.OLEDB.4.0&quot;解决方案
  9. git 合并本地代码到分支
  10. hdu 1002 java 大数相加
  11. PCL—低层次视觉—点云分割(RanSaC)
  12. 未能加载文件或程序集“Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342&quot;
  13. 项目源码--Android基于LBS地理位置信息应用的客户端
  14. Perl时间处理函数
  15. Python学习 常识+基础基础
  16. @SuppressWarnings(&quot;unchecked&quot;)(解决标准的后台HttpServletRequest request, HttpServletResponse response)格式
  17. MySQL获取XML格式数据
  18. Unity3D学习笔记(三)Unity的C#基础
  19. Linux环境下执行java -jar xxx.jar命令如何让springboot项目在后台运行
  20. 【Deep Hash】NINH

热门文章

  1. Hyperledger Fabric基础知识
  2. 计算2的n次幂htm代码
  3. 7.JUC线程高级-生产消费问题&虚假唤醒
  4. C# richtextbox 自动下拉到最后 方法 & RichTextBox读取txt中文后出现乱码
  5. 编写C#程序的IDE
  6. #Week7 Neural Networks : Learning
  7. Onedrive File Open Problem
  8. CF1328B K-th Beautiful String
  9. AWVS 安全渗透扫描
  10. pycharm安装与破解