思路:这是一道矩阵快速幂的题目,求出需要的矩阵来,在乘以初始状态就好了。
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> pil;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define lowbit(x) x&(-x)
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define IO ios::sync_with_stdio(false),cin.tie(0)
const int inf = 0x3f3f3f3f;
const int N = 2;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;
struct mtx {
LL x[N + 1][N + 1];
mtx() {
memset(x, 0, sizeof x);
}
};
mtx operator *(const mtx &a, const mtx &b) {
mtx c;
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
for(int k = 0; k < N; ++k)
c.x[i][j] = (c.x[i][j] + a.x[i][k] * b.x[k][j] % 100000) % 100000;
}
}
return c;
}
mtx operator ^(mtx a, LL n) {
mtx ret;
for(int i = 0; i < N; ++i)
ret.x[i][i] = 1;
while(n) {
if(n & 1)
ret = ret * a;
a = a * a;
n >>= 1;
}
return ret;
}
int main() {
LL n, k, l;
while(cin >> n >> k >> l) {
k %= 100000;
l %= 100000;
n /= 5;
mtx s;
s.x[0][0] = k;
s.x[0][1] = 1;
s.x[1][0] = l;
mtx ans = s ^ (n - 1);
LL pp = (ans.x[0][0] * k % 100000 + ans.x[1][0]) % 100000;//注意初始0的时候是1
printf("%06lld\n", pp);
}
return 0;
}