矩阵乘法一眼题。
首先我们根据题意,
可以得到,
我们既然要求 ,可以通过求 ,而求就要在矩阵中维护,和
所以我们可以得到这样一个矩阵
那么我们还要构造出一个常系数矩阵,结合上面的式子稍微推一推可以得到:
一开始我们可以知道,所以这个矩阵实际上只要乘n-1次。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define ll long long
#define rep(i,n) for (int i=1;i<=n;i++)
const ll mod=10007;
ll n,x,y;
struct arr{
ll n,m,a[5][5];
void init(int x,int y){
n=x;m=y;
memset(a,0,sizeof a);
}
}ans,ini,unit;
arr operator *(const arr A,const arr B){
arr C;
C.init(A.n,B.m);
rep(i,C.n) rep(j,C.m) rep(k,A.m)
C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%mod;
return C;
}
void made(){
ans.init(1,4);
ans.a[1][1]=2;ans.a[1][2]=ans.a[1][3]=ans.a[1][4]=1;
ini.init(4,4);
ini.a[1][1]=1;
ini.a[2][1]=ini.a[2][2]=x*x%mod;ini.a[2][3]=1;ini.a[2][4]=x%mod;
ini.a[3][1]=ini.a[3][2]=y*y%mod;
ini.a[4][1]=ini.a[4][2]=2*x*y%mod;ini.a[4][4]=y%mod;
unit.init(4,4);
rep(i,4) unit.a[i][i]=1;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("fib.in","r",stdin);
#endif
while (~scanf("%lld%lld%lld",&n,&x,&y)){
made();
for (n--;n;n>>=1,ini=ini*ini)
if (n&1) unit=unit*ini;
ans=ans*unit;
printf("%lld\n",ans.a[1][1]);
}
return 0;
}