广义肥波
题目链接: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;
} 
京公网安备 11010502036488号