#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
const long long mod=2147493647;
const int maxn=100000+10;
struct T{
long long maxtrix[7][7];
int lenx,leny;
void base(){
lenx=leny=7;
maxtrix[0][0]=0;maxtrix[0][1]=1;maxtrix[0][2]=0;maxtrix[0][3]=0;maxtrix[0][4]=0;maxtrix[0][5]=0;maxtrix[0][6]=0;
maxtrix[1][0]=2;maxtrix[1][1]=1;maxtrix[1][2]=1;maxtrix[1][3]=0;maxtrix[1][4]=0;maxtrix[1][5]=0;maxtrix[1][6]=0;
maxtrix[2][0]=0;maxtrix[2][1]=0;maxtrix[2][2]=1;maxtrix[2][3]=4;maxtrix[2][4]=6;maxtrix[2][5]=4;maxtrix[2][6]=1;
maxtrix[3][0]=0;maxtrix[3][1]=0;maxtrix[3][2]=0;maxtrix[3][3]=1;maxtrix[3][4]=3;maxtrix[3][5]=3;maxtrix[3][6]=1;
maxtrix[4][0]=0;maxtrix[4][1]=0;maxtrix[4][2]=0;maxtrix[4][3]=0;maxtrix[4][4]=1;maxtrix[4][5]=2;maxtrix[4][6]=1;
maxtrix[5][0]=0;maxtrix[5][1]=0;maxtrix[5][2]=0;maxtrix[5][3]=0;maxtrix[5][4]=0;maxtrix[5][5]=1;maxtrix[5][6]=1;
maxtrix[6][0]=0;maxtrix[6][1]=0;maxtrix[6][2]=0;maxtrix[6][3]=0;maxtrix[6][4]=0;maxtrix[6][5]=0;maxtrix[6][6]=1;
}
void get1(int k){
lenx=leny=k;
memset(maxtrix,0,sizeof(maxtrix));
for(int i=0;i<k;++i)maxtrix[i][i]=1;
}
}t;
T operator *(T x,T y){
T res;
memset(res.maxtrix,0,sizeof(res.maxtrix));
res.lenx=x.lenx;
res.leny=y.leny;
for(int i=0;i<x.lenx;i++){
for(int j=0;j<y.leny;j++){
for(int k=0;k<x.leny;k++){
res.maxtrix[i][j]=((x.maxtrix[i][k]*y.maxtrix[k][j])%mod+res.maxtrix[i][j])%mod;
}
}
}
return res;
}
T _pow(T a,long long x){
T res;res.get1(7);
while(x){
if(x&1)res=res*a;
a=a*a;
x>>=1;
}
return res;
}
int main(){
freopen("sequence.in", "r", stdin);
freopen("sequence.out", "w", stdout);
long long i,j,k,m,n,a1,a2;
T x;x.base();
scanf("%lld%lld%lld",&n,&a1,&a2);
x=_pow(x,n-2);
T ans;
ans.lenx=7;ans.leny=1;
ans.maxtrix[0][0]=a1;ans.maxtrix[1][0]=a2;
ans.maxtrix[2][0]=81;
ans.maxtrix[3][0]=27;
ans.maxtrix[4][0]=9;
ans.maxtrix[5][0]=3;
ans.maxtrix[6][0]=1;
ans=x*ans;
cout<<ans.maxtrix[1][0]<<endl;
return 0;
}
转载于:https://www.cnblogs.com/brodrinkwater/p/7528008.html