题意:f0=a,f1=b,fn=f(n-1)+f(n-2),求f(n)%(pow(10,m));
n的数量级是1e9,不论fn的范围也是会超时的,所以显然不能暴力求解,这题我们应采用矩阵快速幂求解,初始矩阵和求斐波那契数列相同,唯一改变的就是f0和f1,因为矩阵快速幂用的是乘法,所以我们每一步都可以取余,不用用高精/大数(亲测大数超时)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
typedef long long ll;
using namespace std;
struct martax {
ll rax[5][5];
}ans,test;
int mod;
martax quick_pow(martax rax1, martax rax2) {
martax temp;
memset(temp.rax,0,sizeof(temp.rax));
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 2; j++) {
for (int k = 1; k <= 2; k++) {
temp.rax[i][j] = (temp.rax[i][j] + rax1.rax[i][k] * rax2.rax[k][j])%mod;
}
}
}
return temp;
}
void solve(int k) {
memset(ans.rax, 0, sizeof(ans.rax));
ans.rax[1][1] = ans.rax[2][2] = 1;
while (k) {
if (k & 1) ans = quick_pow(ans,test);
test = quick_pow(test, test);
k /= 2;
}
}
int main() {
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--) {
int a, b, n, m;
cin >> a >> b >> n >> m;
test.rax[1][1] = test.rax[1][2] = test.rax[2][1] = 1;
test.rax[2][2] = 0;
mod = pow(10, m);
if (n == 0) {
cout << a % mod << endl;
continue;
}
else if (n == 1) {
cout << b % mod << endl;
continue;
}
solve(n-1);
cout << (b * ans.rax[1][1] + a * ans.rax[1][2]) % mod << endl;
}
}