1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <iostream> #include <cstring> #include <cstdio> #include <cctype>
using namespace std;
inline int read() { int x=0,f=1; char ch=getchar(); while (!isdigit(ch)) f=ch=='-'?-1:f,ch=getchar(); while (isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f; }
const int M=100005; const int P=1000000007;
struct matrix { int r,c; int num[3][3];
inline matrix (){r=c=3,memset(num,0,sizeof num),num[0][0]=num[1][1]=num[2][2]=1;}
inline matrix operator*(matrix const x)const { matrix ret; ret.r=r,ret.c=x.c,memset(ret.num,0,sizeof ret.num); for (int i=0;i<ret.r;++i) for (int j=0;j<ret.c;++j) for (int k=0;k<c;++k) (ret.num[i][j]+=1ll*num[i][k]*x.num[k][j]%P)%=P; return ret; } }trs,trs_,f;
inline matrix operator^(matrix x,int y) { matrix ret=matrix(); for (;y;y>>=1,x=x*x) if (y&1) ret=ret*x; return ret; }
int x[M]; int n,m,ans;
void calc() { trs.r=trs.c=3; trs.num[0][0]=1,trs.num[1][0]=0,trs.num[2][0]=1; trs.num[0][1]=2,trs.num[1][1]=1,trs.num[2][1]=2; trs.num[0][2]=1,trs.num[1][2]=1,trs.num[2][2]=2; trs_.r=trs_.c=3; trs_.num[0][0]=1,trs_.num[1][0]=0,trs_.num[2][0]=0; trs_.num[0][1]=2,trs_.num[1][1]=1,trs_.num[2][1]=0; trs_.num[0][2]=1,trs_.num[1][2]=1,trs_.num[2][2]=1; f.r=1,f.c=3,f.num[0][0]=1,f.num[0][1]=f.num[0][2]=0; x[0]=0; for (int i=1;i<=m;++i) f=f*(trs^(x[i]-x[i-1]-(i>1)))*trs_; f=f*(trs^(n-x[m]-(m>0))); }
int main() { freopen("placing.in","r",stdin),freopen("placing.out","w",stdout); n=read(),m=read(); for (int i=1;i<=m;++i) x[i]=read(); calc(),printf("%d\n",f.num[0][2]); fclose(stdin),fclose(stdout); return 0; }
|