HDU 1588 Gauss Fibonacci(矩阵快速幂)
Gauss Fibonacci
Total Submission(s): 27 Accepted Submission(s): 5
How good an opportunity that Gardon can not give up! The "Problem GF" told by Angel is actually "Gauss Fibonacci".
As we know ,Gauss is the famous mathematician who worked out the sum from 1 to 100 very quickly, and Fibonacci is the crazy man who invented some numbers.
Arithmetic progression:
g(i)=k*i+b;
We assume k and b are both non-nagetive integers.
Fibonacci Numbers:
f(0)=0
f(1)=1
f(n)=f(n-1)+f(n-2) (n>=2)
The Gauss Fibonacci problem is described as follows:
Given k,b,n ,calculate the sum of every f(g(i)) for 0<=i<n
The answer may be very large, so you should divide this answer by M and just output the remainder instead.
Each of them will not exceed 1,000,000,000.
2 1 4 100
2 0 4 100
21
12 by yxt
用于构造斐波那契的矩阵为
1,1
1,0
设这个矩阵为A。
sum=f(b)+f(k+b)+f(2*k+b)+f(3*k+b)+........+f((n-1)*k+b)
<=>sum=A^b+A^(k+b)+A^(2*k+b)+A^(3*k+b)+........+A^((n-1)*k+b)
<=>sum=A^b+A^b*(A^k+A^2*k+A^3*k+.......+A^((n-1)*k)) (1)
设矩阵B为A^k;
那么(1)式为 sum=A^b+A^b*(B+B^2+B^3+......+B^(n-1));
显然,这时候就可以用二分矩阵做了,括号内的就跟POJ 3233的形式一样了。
代码如下
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm> using namespace std;
#define LL __int64
LL mod;
struct matrix
{
LL ma[][];
}init, res1, res2, ans;
matrix Mult(matrix x, matrix y)//矩阵相乘
{
matrix tmp;
int i, j, k;
for(i=;i<;i++)
{
for(j=;j<;j++)
{
tmp.ma[i][j]=;
for(k=;k<;k++)
{
tmp.ma[i][j]=(tmp.ma[i][j]+x.ma[i][k]*y.ma[k][j])%mod;
}
}
}
return tmp;
}
matrix Pow(matrix x, int k) //矩阵快速幂关键
{
matrix tmp;
int i, j;
for(i=;i<;i++) for(j=;j<;j++) tmp.ma[i][j]=(i==j);
while(k)
{
if(k&) tmp=Mult(tmp,x);
x=Mult(x,x);
k>>=;
}
return tmp;
}
matrix Add(matrix x, matrix y)//矩阵相加
{
int i, j;
matrix tmp;
for(i=;i<;i++)
{
for(j=;j<;j++)
{
tmp.ma[i][j]=(x.ma[i][j]+y.ma[i][j])%mod;
}
}
return tmp;
}
matrix Sum(matrix x, int k)//等比矩阵求和
{
if(k==) return x;
if(k&)
return Add(Sum(x,k-),Pow(x,k));
matrix tmp;
tmp=Sum(x,k>>);
return Add(tmp,Mult(tmp,Pow(x,k>>)));
}
int main()
{
int k, b, n;
while(scanf("%d%d%d%d",&k,&b,&n,&mod)!=EOF)
{
init.ma[][]=;
init.ma[][]=;
init.ma[][]=;
init.ma[][]=;
res1=Pow(init,b);
res2=Pow(init,k);
ans=Add(res1,Mult(res1,Sum(res2,n-)));
printf("%I64d\n",ans.ma[][]);
}
return ;
}
HDU 1588 Gauss Fibonacci(矩阵快速幂)的更多相关文章
- HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)
HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出 ...
- HDU.1575 Tr A ( 矩阵快速幂)
HDU.1575 Tr A ( 矩阵快速幂) 点我挑战题目 题意分析 直接求矩阵A^K的结果,然后计算正对角线,即左上到右下对角线的和,结果模9973后输出即可. 由于此题矩阵直接给出的,题目比较裸. ...
- HDU 2842 (递推+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...
- hdu 2604 Queuing(矩阵快速幂乘法)
Problem Description Queues and Priority Queues are data structures which are known to most computer ...
- poj 3070 Fibonacci (矩阵快速幂乘/模板)
题意:给你一个n,输出Fibonacci (n)%10000的结果 思路:裸矩阵快速幂乘,直接套模板 代码: #include <cstdio> #include <cstring& ...
- poj 3070 Fibonacci 矩阵快速幂
Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. F ...
- HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with ...
- 2013长春网赛1009 hdu 4767 Bell(矩阵快速幂+中国剩余定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4767 题意:求集合{1, 2, 3, ..., n}有多少种划分情况bell[n],最后结果bell[ ...
- HDU 6470 Count 【矩阵快速幂】(广东工业大学第十四届程序设计竞赛 )
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6470 Count Time Limit: 6000/3000 MS (Java/Others) ...
随机推荐
- BZOJ 1068 【SCOI2007】 压缩
题目链接:压缩 区间动归水题.稍微有一点细节. 令\(f_{l,r}\)表示区间\([l,r]\)最短压缩长度,默认\(l\)位置之前有个\(M\).然后就枚举一下放不放\(R\),\(M\)放哪个位 ...
- rostopic 命令
rostopic bw display bandwidth used by topic// rostopic delay display delay for topic which has heade ...
- shell 跳出循环
跳出循环 break命令 例: #!/bin/bash while : do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1 ...
- ubuntu16.04中开启和关闭防火墙
开启防火墙 ufw enable 关闭防火墙 ufw disable
- Kali Linux 2016.2初体验
前言 Kali Linux官 方于8月30日发布Kali Linux 2016的第二个版本Kali Linux 2016.2.该版本距离Kali Linux 2016.1版本发布,已经有7个月.在这期 ...
- hihoCoder 1636 Pangu and Stones
hihoCoder 1636 Pangu and Stones 思路:区间dp. 状态:dp[i][j][k]表示i到j区间合并成k堆石子所需的最小花费. 初始状态:dp[i][j][j-i+1]=0 ...
- angular5 ng-bootstrap和ngx-bootstrap区别
https://angular.cn/resources ngx-bootstrap 安装: npm install ngx-bootstrap --save 再引入css <link href ...
- SpringBoot导入excle文件数据
本文主要描述,Springboot框架下上传excel,处理里面相关数据做逻辑分析,由于用到的是前后端分离技术,这里记录的主要是后端java部分,通过与前端接口进行对接实现功能 1.在pom.xml文 ...
- golang martini 源码阅读笔记之inject
martini是go语言写的一个超级轻量的web开源框架,具体源码可在github搜索找到.13年那会开始接触go语言时有稍微看过这个框架,由于之后没有继续使用go就慢慢忽略了,最近由于手头项目可能会 ...
- 多态性&& 虚函数 && 抽象类
http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/11/2134673.html 多态性 指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动 ...