广义肥波

题目链接:nowcoder 214267

到主站看:https://blog.csdn.net/weixin_43346722/article/details/112726718

题目大意

定义广义斐波那契数列:
然后让你求

思路

看到题目的范围,我们可以看出应该是枚举一个 ,然后其他数的 log,大概这样的复杂度。

然后很明显枚举 可以得出 ,但是你要求的是 不能取模,你总不能搞高精吧。

那我们考虑不求 ,枚举 求出 的值
那我们可以看出转移就是:。(就是全部运算往上诺一级)

这样就可以在取模的意义下进行而不出问题了。

代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define mo 1000000007

using namespace std;

ll a, b, m, re, tmp, l, r;
int n;

ll ksm(ll x, ll y) {
    re = 1ll;
    while (y) {
        if (y & 1) re = (re * x) % mo;
        x = (x * x) % mo;
        y >>= 1;
    }
    return re;
}

int main() {
    scanf("%lld %lld %lld %d", &a, &b, &m, &n);

    l = r = m;
    for (int i = 3; i <= n; i++) {
        tmp = (ksm(l, b) % mo * ksm(r, a)) % mo;
        l = r;
        r = tmp;
    }

    printf("%lld", r);

    return 0;
}