NC212279. 魔改斐波那契
描述
输入描述
输入包含两行。
第一行包含四个整数a, b, c, d
,
第二行包含两个整数n和m。注意n的大小。
输出描述
输出一个整数代表答案。
示例1
输入:
1 1 1 1 2 100
输出:
9
示例2
输入:
1 2 3 4 610610610610610610 666666
输出:
121509
C++ 解法, 执行用时: 691ms, 内存消耗: 1068K, 提交时间: 2021-07-28 11:36:12
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> PII; const int N = 3, mod = 1e9 + 7; ll a, b, c, d, p; string n; void mul(ll c[][N], ll a[][N], ll b[][N]) { // c = a * b static ll t[N][N]; memset(t, 0, sizeof t); for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) for(int k = 0; k < N; k++) t[i][j] = (t[i][j] + a[i][k] * b[k][j]) % p; memcpy(c, t, sizeof t); } void qpow(ll f[][N], ll a[][N], int sz) { while(~sz) { int cnt = n[sz--] - '0'; for(int i = 0; i < cnt; i++) mul(f, f, a); static ll t[N][N]; mul(a, a, a); mul(t, a, a); mul(t, t, t); mul(a, a, t); } } int main() { ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); cin >> a >> b >> c >> d >> n >> p; ll f[N][N] = {d, c, 1}; ll t[N][N] = {{a, 1, 0}, {b, 0, 0}, {7, 0, 1}}; qpow(f, t, n.size() - 1); cout << f[0][1] << endl; return 0; }