HDU1588-Gauss Fibonacci(矩阵快速幂+等比数列二分求和)
来源:互联网 发布:大数据应用网站 编辑:程序博客网 时间:2024/05/23 11:28
题目链接
题意: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;}
0 0
- HDU1588-Gauss Fibonacci(矩阵快速幂+等比数列二分求和)
- HDU1588 Gauss Fibonacci (矩阵快速幂+等比数列二分求和)
- hdu1588 Gauss Fibonacci (矩阵快速幂)
- hdu1588 Gauss Fibonacci 矩阵快速幂
- hdu1588 Gauss Fibonacci(矩阵快速幂+二分求矩阵等比和)
- [HDU1588]Gauss Fibonacci(递推+矩阵快速幂)
- hdu 1588 Gauss Fibonacci(斐波那契,等比数列求和,矩阵快速幂)
- HDU 1588 Gauss Fibonacci(矩阵快速幂+二分求等比数列和)
- HDU - 1588 Gauss Fibonacci (矩阵快速幂+二分求等比数列和)
- HDU1588 Gauss Fibonacci 矩阵应用
- 快速矩阵幂+二分等比数列求和
- HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和)
- hdu1588---Gauss Fibonacci(矩阵,线性递推)
- 【HDU 1588】Gauss Fibonacci(矩阵快速幂+二分)
- hdoj 1588 矩阵快速幂 二分等比数列求和模板
- Gauss Fibonacci hdu1588
- hdu1588 Gauss Fibonacci
- HDU1588 Gauss Fibonacci
- Phonegap2.9.0本地打包html成ios应用
- Android 自定义控件之界面标题导航及控件打包共享
- PhoneGap2.9.0本地将html打包成Android应用
- ios UIWebView截获html并修改便签内容
- 关于hibernate调用存储过程
- HDU1588-Gauss Fibonacci(矩阵快速幂+等比数列二分求和)
- 浏览器的工作原理(一)
- 删除当前用户所有表
- Codeforces 67A. Partial Teacher
- PhoneGap2.9.0本地将html打包成Android应用
- chapter5
- 只有一个broker的例子
- django book笔记--问题2(chapter4 importError)
- 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)