http://codeforces.com/gym/101473 H buses
#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e6;
struct M
{
long long a[2][2];
};
M multi(const M& x, const M& y) //矩阵乘法
{
M z;
for(int i = 0; i < 2; i ++) {
for(int j = 0; j < 2; j ++) {
z.a[i][j] = 0;
for(int k = 0; k < 2; k ++) {
long long hx = x.a[i][k] % mod;
long long hy = y.a[k][j] % mod;
long long tmp = hx * hy % mod;
z.a[i][j] = (z.a[i][j] + tmp) % mod;
}
}
}
return z;
}
M qpow(long long n, long long A, long long B) //快速幂
{
M ans;
ans.a[0][0] = 1, ans.a[0][1] = 0;
ans.a[1][0] = 0, ans.a[1][1] = 1;
M t;
t.a[0][0] = A, t.a[0][1] = B;
t.a[1][0] = 1, t.a[1][1] = 0;
while (n) //快速幂
{
if (n & 1) //这位上为1 ans*=t;
ans = multi(ans, t);
t = multi(t, t); //t自身平方
n >>= 1;
}
return ans;
}
int main()
{
long long n, A, B;
scanf("%lld%lld%lld", &n, &A, &B);
//f[i] = A * f[i - 5] + B * f[i - 10]
//构造矩阵 矩阵快速幂加速
// | A B | * | f[i-5] 0| = | f[i] 0 |
// | 1 0 | | f[i-10] 0| | f[i-5] 0 |
// 矩阵自身相乘(n/5-1)次
M u = qpow(n / 5 - 1, A, B);
M v; //初始值
v.a[0][0] = A, v.a[0][1] = 0;
v.a[1][0] = 1, v.a[1][1] = 0;
M w = multi(u, v);
printf("%06lld\n", w.a[0][0]);
return 0;
}