题目链接

题意:g(x) = k * x + b。f(x) 为Fibonacci数列。求f(g(x)),从x = 1到n的数字之和sum。并对m取模。

思路: 

设A = |(1, 1),(1, 0)| 

sum = f(b) + f(k + b) + f(2k + b)...+f((n-1)k + b) (f(x) 为Fibonacci数列) 

sum = A^b + A^(k + b) + A^(2k + b)...+ A^((n-1)k + b) 

sum = A^b(1 + A^k + A^2k...+A^(n-1)k) 

所以A^b与A^k能够用矩阵高速幂求解 

之后能够设B = A^k 

所以式子能够转化为sum = A^b(1 + B + B^2..+ B^(n - 1)) 

sum就能够使用等比数列二分求和来攻克了。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; //typedef long long ll;
typedef __int64 ll; const int N = 2; struct mat{
ll s[N][N];
mat(ll a = 0, ll b = 0, ll c = 0, ll d = 0) {
s[0][0] = a;
s[0][1] = b;
s[1][0] = c;
s[1][1] = d;
}
mat operator * (const mat& c) {
mat ans;
memset(ans.s, 0, sizeof(ans.s));
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
ans.s[i][j] = (s[i][0] * c.s[0][j] + s[i][1] * c.s[1][j]);
return ans;
}
mat operator % (int mod) {
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
s[i][j] %= mod;
return *this;
}
mat operator + (const mat& c) {
mat ans;
memset(ans.s, 0, sizeof(ans.s));
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
ans.s[i][j] = s[i][j] + c.s[i][j];
return ans;
}
void put() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
printf("%I64d ", s[i][j]);
printf("\n");
}
}
}c(1, 1, 1, 0), tmp(1, 0, 0, 1); ll k, b, n, M; mat pow_mod(int n, mat c) {
if (n == 0)
return tmp;
if (n == 1)
return c;
mat a = pow_mod(n / 2, c);
mat ans = a * a % M;
if (n % 2)
ans = ans * c % M;
return ans;
} mat sum(int n, mat a) {
if (n == 1)
return a;
if (n & 1)
return (pow_mod(n, a) + sum(n - 1, a)) % M;
else
return (((pow_mod(n / 2, a) + tmp) % M) * sum(n / 2, a) % M);
} int main() {
while (scanf("%I64d%I64d%I64d%I64d", &k, &b, &n, &M) != EOF) {
mat A = pow_mod(b, c);
mat B = pow_mod(k, c);
mat C = sum(n - 1, B) + tmp;
C = C * A;
printf("%I64d\n", C.s[0][1] % M);
}
return 0;
}

HDU1588-Gauss Fibonacci(矩阵高速幂+等比数列二分求和)的更多相关文章

  1. HDU 1588 Gauss Fibonacci(矩阵快速幂)

    Gauss Fibonacci Time Limit: 3000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) ...

  2. HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

    HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意:  g(i)=k*i+b;i为变量.  给出 ...

  3. HDU 2254 奥运(矩阵高速幂+二分等比序列求和)

    HDU 2254 奥运(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意:  中问题不解释. 分析:  依据floyd的算法,矩阵的k次方表示这个矩阵走了k步.  所以k ...

  4. hdu 3306 Another kind of Fibonacci(矩阵高速幂)

    Another kind of Fibonacci                                                        Time Limit: 3000/10 ...

  5. hdu 5411 CRB and Puzzle 矩阵高速幂

    链接 题解链接:http://www.cygmasot.com/index.php/2015/08/20/hdu_5411/ 给定n个点 常数m 以下n行第i行第一个数字表示i点的出边数.后面给出这些 ...

  6. UVA10518 - How Many Calls?(矩阵高速幂)

    UVA10518 - How Many Calls?(矩阵高速幂) 题目链接 题目大意:给你fibonacci数列怎么求的.然后问你求f(n) = f(n - 1) + f(n - 2)须要多少次调用 ...

  7. HDU 1575 Tr A(矩阵高速幂)

    题目地址:HDU 1575 矩阵高速幂裸题. 初学矩阵高速幂.曾经学过高速幂.今天一看矩阵高速幂,原来其原理是一样的,这就好办多了.都是利用二分的思想不断的乘.仅仅只是把数字变成了矩阵而已. 代码例如 ...

  8. HDOJ How many ways?? 2157【矩阵高速幂】

    How many ways? ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. poj 3233(矩阵高速幂)

    题目链接:http://poj.org/problem?id=3233. 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以非常显然是矩阵高速幂,但有一点.本题k的值非常大.所以要用 ...

随机推荐

  1. redis学习之一 - linux下安装配置

    Content 0.序 1.如何安装? 2.配置参数及其意义 3.设为linux服务 0.序 本文主要是记录Redis在 Centos下的安装配置 .文中如无特别说明.表示redis-3.2.10代码 ...

  2. JS仿淘宝左侧菜单

    http://www.webdm.cn/webcode/1c724a06-06f4-4c4f-931a-c683285fa700.html

  3. CAN 总线通信控制芯片SJA1000 的读写

    SJA1000 控制信号的产生 CAN总线通信控制芯片SJA1000 没有提供单独的地址线,而使用可以与Intel 和Motorola系列微控制器兼容的分时复用地址/ 数据线.在一个读写周期内,微控制 ...

  4. GDB 自动化操作的技术-PYTHON

    https://github.com/spacewander/debugger-utils http://python.jobbole.com/85415/ https://segmentfault. ...

  5. Big Number------HDOJ杭电1212(大数运算)

    Problem Description As we know, Big Number is always troublesome. But it's really important in our A ...

  6. 用最简单的例子理解装饰器模式(Decorator Pattern)

    假设有一个公司要做产品套餐,即把不同的产品组合在一起,不同的组合对应不同的价格.最终呈现出来的效果是:把产品组合的所有元素呈现出来,并显示该组合的价格. 每个产品都有名称和价格,首先设计一个关于产品的 ...

  7. java四舍五入保留两位小数4种方法

    4种方法,都是四舍五入,例: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberF ...

  8. Windows 8 Metro 应用开发入门(一):开发环境介绍

    摘 要 Windows8已经发布,随之而来的基于WinRT的Metro应用也正向我们走来,正像它所宣传的:光滑.快.现代.看习惯了玻璃.立体风格的应用,或许Metro的简洁能给你留下不一样的体验.Vi ...

  9. 算法:堆(Heap)

    背景 Heap 可以用来实现优先级队列,也可以用来做堆排序,本文简单的做个介绍. Heap 规则 是一个完全二叉树,隐含的意思是:他是平衡的.使用数组进行存储也是连续的. 给定的任意节点,该节点小于等 ...

  10. C++中的public、private、protected成员继承问题

        我是C++菜鸟,刚学了一点C++. 先看例子1: /* Item.h */ #include <iostream> #include <string> class It ...