HDU 6198 推公式+矩阵快速幂
2017-09-14 19:30
435 查看
题目
number number number题意
推公式,矩阵快速幂。给一个菲波那切数列,然后满足n=Fa1+Fa2+...+Fak, 其中 0≤a1≤a2≤⋯≤ak 的 n 为 mjf−good ,否则为 mjf−bad, 现在给你一个数字 k,请你找出最小的mjf−bad,答案 module 998244353。
题解
推公式,矩阵快速幂。先打个菲波那切数列的表,然后很容易观察出来,给定 k,答案是 F2∗k+3−1,然后用矩阵快速幂,就可以解决了。代码
#include <algorithm> #include <bitset> #include <cstring> #include <cstdio> #include <cmath> #include <cstdlib> #include <climits> #include <iostream> #include <list> #include <map> #include <queue> #include <set> #include <stack> #include <string> #include <vector> using namespace std; typedef vector<long long> vec; typedef vector<vec> mat; const long long mod = 998244353; //计算 A*B mat mul(mat &A, mat &B) { mat C(A.size(),vec(B[0].size())); for(int i=0;i<A.size();++i){ for(int k=0;k<B.size();++k){ for(int j=0;j<B[0].size();++j){ C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % mod; } } } return C; } // 计算 A^n mat pow(mat A, long long n){ mat B(A.size(), vec(A.size())); for(int i=0;i<A.size();i++){ B[i][i] = 1; } while(n > 0){ if(n & 1) B = mul(B, A); A = mul(A, A); n >>= 1; } return B; } // 2*n+1 int main(){ int n; while(cin >> n){ mat A(2, vec(2)); A[0][0] = A[0][1] = 1; A[1][0] = 1; A[1][1] = 0; mat B(2, vec(2)); B[0][0] = B[0][1] = 1; B[1][0] = B[1][1] = 0; A = pow(A, 2*n+1); B = mul(B, A); cout << B[0][0] - 1 << endl; } return 0; }
相关文章推荐
- hdu 6198(找规律、矩阵快速幂)
- HDU-6198 - number number number - 矩阵快速幂
- hdu 4565 公式推导+矩阵快速幂
- Hdu 6198 number number number【矩阵快速幂】
- ZOJ 3690 & HDU 3658 (矩阵快速幂+公式递推)
- 【打表找规律+矩阵快速幂】number number number HDU - 6198
- HDU 2256 & HDU 4565 (矩阵快速幂 + 公式推演)
- hdu 3411 推公式+矩阵快速幂
- HDU 6050 Funny Function(矩阵快速幂或公式)
- (矩阵快速幂, 数学公式推导)HDU 6050 Funny Function
- number number number HDU - 6198(矩阵快速幂)
- hdu 6198 矩阵快速幂
- 【HDU 6198】number number number 【规律+矩阵快速幂】
- hdu 3117 Fibonacci Numbers 矩阵快速幂+公式
- 【公式+矩阵快速幂】HDU_3117 Fibonacci Numbers
- hdu 4602(推公式、矩阵快速幂)
- HDU-6198 number number number(打表找规律、矩阵快速幂)
- HDU - 6050(推公式、矩阵快速幂)
- HDU 6198 number number number【找规律+矩阵快速幂】
- HDU 4686 (推公式+矩阵快速幂)