HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)
HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)
ACM
题意:
g(i)=k*i+b;i为变量。
给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值。
分析:
把斐波那契的矩阵带进去,会发现这个是个等比序列。
推倒:
S(g(i))
= F(b) + F(b+k) + F(b+2k) + .... + F(b+nk)
// 设 A = {1,1,0,1}, (花括号表示矩阵...)
// 也就是fib数的变化矩阵,F(x) = (A^x) * {1,0}
= F(b) + (A^k)F(b) + (A^2k)F(b)+….+(A^nk)F(b)
// 提取公因式 F(b)
= F(b) [ E +A^k + A^2k + ….+ A^nk] // (E表示的是单位矩阵)
// 令 K = A^k 后
E +A^k + A^2k + ….+ A^nk 变成 K^0+K^1+K^2+…+K^n
然后等比数列是能够二分求和的:数论_等比数列二分求和
代码:
- /*
- * Author: illuz <iilluzen[at]gmail.com>
- * Blog: http://blog.csdn.net/hcbbt
- * File: 1588.cpp
- * Create Date: 2014-08-04 16:13:51
- * Descripton: Matrix
- */
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <map>
- #include <algorithm>
- using namespace std;
- #define repf(i,a,b) for(int i=(a);i<=(b);i++)
- typedef long long ll;
- const int N = 20;
- const int SIZE = 2; // max size of the matrix
- ll MOD;
- ll k, b, n;
- struct Mat{
- int n;
- ll v[SIZE][SIZE]; // value of matrix
- Mat(int _n = SIZE) {
- n = _n;
- }
- void init(ll _v = 0) {
- memset(v, 0, sizeof(v));
- if (_v)
- repf (i, 0, n - 1)
- v[i][i] = _v;
- }
- void output() {
- repf (i, 0, n - 1) {
- repf (j, 0, n - 1)
- printf("%lld ", v[i][j]);
- puts("");
- }
- puts("");
- }
- } a, B, C;
- Mat operator * (Mat a, Mat b) {
- Mat c(a.n);
- repf (i, 0, a.n - 1) {
- repf (j, 0, a.n - 1) {
- c.v[i][j] = 0;
- repf (k, 0, a.n - 1) {
- c.v[i][j] += (a.v[i][k] * b.v[k][j]) % MOD;
- c.v[i][j] %= MOD;
- }
- }
- }
- return c;
- }
- Mat operator ^ (Mat a, ll k) {
- Mat c(a.n);
- c.init(1);
- while (k) {
- if (k&1) c = a * c;
- a = a * a;
- k >>= 1;
- }
- return c;
- }
- Mat operator + (Mat a, Mat b) {
- Mat c(a.n);
- repf (i, 0, a.n - 1)
- repf (j, 0, a.n - 1)
- c.v[i][j] = (b.v[i][j] + a.v[i][j]) % MOD;
- return c;
- }
- Mat operator + (Mat a, ll b) {
- Mat c = a;
- repf (i, 0, a.n - 1)
- c.v[i][i] = (a.v[i][i] + b) % MOD;
- return c;
- }
- // 二分求和1..n
- Mat calc(Mat a, int n) {
- if (n == 1)
- return a;
- if (n&1)
- return (a^n) + calc(a, n - 1);
- else
- return calc(a, n/2) * ((a^(n/2)) + 1);
- }
- int main() {
- a.init();
- a.v[0][0] = a.v[0][1] = a.v[1][0] = 1;
- while (~scanf("%lld%lld%lld%lld", &k, &b, &n, &MOD)) {
- B = (a^k);
- C = calc(B, n - 1) + (a^0);
- C = (a^b) * C;
- printf("%lld\n", C.v[0][1]);
- }
- return 0;
- }
HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)的更多相关文章
- HDU 2254 奥运(矩阵高速幂+二分等比序列求和)
HDU 2254 奥运(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意: 中问题不解释. 分析: 依据floyd的算法,矩阵的k次方表示这个矩阵走了k步. 所以k ...
- HDU 1588 Gauss Fibonacci(矩阵快速幂)
Gauss Fibonacci Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU1588-Gauss Fibonacci(矩阵高速幂+等比数列二分求和)
题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum.并对m取模. 思路: 设A = |(1, 1),(1, 0) ...
- HDU 1575 Tr A(矩阵高速幂)
题目地址:HDU 1575 矩阵高速幂裸题. 初学矩阵高速幂.曾经学过高速幂.今天一看矩阵高速幂,原来其原理是一样的,这就好办多了.都是利用二分的思想不断的乘.仅仅只是把数字变成了矩阵而已. 代码例如 ...
- HDU - 1588 Gauss Fibonacci (矩阵高速幂+二分求等比数列和)
Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very cle ...
- hdu 1588(Fibonacci矩阵求和)
题目的大意就是求等差数列对应的Fibonacci数值的和,容易知道Fibonacci对应的矩阵为[1,1,1,0],因为题目中f[0]=0,f[1]=1,所以推出最后结果f[n]=(A^n-1).a, ...
- hdu 1588 Gauss Fibonacci(矩阵嵌矩阵)
题目大意: 求出斐波那契中的 第 k*i+b 项的和. 思路分析: 定义斐波那契数列的矩阵 f(n)为斐波那契第n项 F(n) = f(n+1) f(n) 那么能够知道矩阵 A = 1 1 1 0 ...
- HDU 2604 Queuing(矩阵高速幂)
题目地址:HDU 2604 这题仅仅要推出公式来,构造矩阵就非常easy了.问题是推不出公式来..TAT.. 从递推的思路考虑.用f(n)表示n个人满足条件的结果.假设最后一个是m则前n-1人能够随意 ...
- HDU 2604 Queuing,矩阵高速幂
题目地址:HDU 2604 Queuing 题意: 略 分析: 易推出: f(n)=f(n-1)+f(n-3)+f(n-4) 构造一个矩阵: 然后直接上板子: /* f[i] = f[i-1] ...
随机推荐
- mount nfs 各版本之间的转换
[root@one1-fst-hx ~]# mount.nfs 182.168.2.49:/mnt/sdb/nfs /mnt/nfs2/ nomand,-o vers=3[root@one1-fst- ...
- vue 数据没有驱动视图?
Part.1 问题 数据改变,视图却没有根据数据而改变. 原因在于,数据并不在 vue 监听范围之内,vue 只对事先在 data 中声明的变量丶对象等类型数据进行监听 Part.2 例子 < ...
- Shell替换数组元素之间的间隔符号
Shell中的数组是这样表示的: arr=(1,2,3,4,5) 它们数组元素的间隔符号为逗号,如果我相把逗号替换为加号: echo ${arr//,/+} 输出: 1+2+3+4+5 这个表达式是我 ...
- docker 私有镜像服务器搭建
1.准备一台服务器A(已安装docker, IP:192.168.39.111) 2.在服务器A上通过运行registry容器进行搭建 docker run -itd -v /my_registry: ...
- php中session和cookie的使用及区别
1.cookie的使用 什么是 Cookie? cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 P ...
- uwsgs loading shared libraries: libicui18n.so.58 异常处理
背景 想使用 ningx + uwsgi + flask 搭建 python 应用环境 Python使用的是anaconda3(pyhton 3.6) 依赖包安装完毕,但是执行 uwsgi 的时候出现 ...
- 数据结构实验7:实现二分查找、二叉排序(查找)树和AVL树
实验7 学号: 姓名: 专业: 7.1实验目的 (1) 掌握顺序表的查找方法,尤其是二分查找方法. (2) 掌握二叉排序树的建立及查找. 查找是软件设计中的最常用的运算,查找所涉及到 ...
- [数据结构]C#基于数组实现泛型顺序表
前方预警,只完成了顺序表的插入/删除/查找. 错误代码示例: /// <summary> /// 查找顺序表第i个位置的元素 /// 在显示情况中,我们更常用下标 /// </sum ...
- 【shell】通过shell编写ping包及arp的监控并发送短信
1 #!/bin/bash 2 NOW="`date +%Y%m%d-%H:%M:%S`" 3 PHONES=15134567893 4 IP=10.100.8.78 5 GATE ...
- 【Educational Codeforces Round 48】
A:https://www.cnblogs.com/myx12345/p/9843001.html B:https://www.cnblogs.com/myx12345/p/9843021.html ...