列表

详情


NC212279. 魔改斐波那契

描述

kcxz对原斐波那契数列进行了魔改,魔改后的数列被定义为:
, ,
请你输出f_n对m取余后的值。

输入描述

输入包含两行。
第一行包含四个整数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;
}

上一题