当时不会矩乘,所以退出是个明智的选择。。。
会矩乘后这题就很容易了。。。注意超longlong和y>x就可以了。。。
1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(i=l;i<=r;i++) 3 #define dec(i,l,r) for(i=l;i>=r;i--) 4 #define mem(a) memset(a,0,sizeof(a)) 5 #define ll long long 6 #define succ(x) (1<<x) 7 using namespace std; 8 ll read(){ 9 ll x=0,f=1;char ch=getchar(); 10 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 11 while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); 12 return x*f; 13 } 14 struct mat{ 15 ll n,m; 16 ll a[20][20]; 17 }a,b,tmp; 18 ll k,x,inf,i; 19 mat operator*(const mat&x,const mat&y){ 20 mat s; 21 int i,j,k; 22 mem(s.a); 23 s.n=x.n;s.m=y.m; 24 inc(i,1,s.n) 25 inc(j,1,s.m) 26 inc(k,1,x.m){ 27 ll t=(ll)sqrt(y.a[k][j]),v=x.a[i][k]; 28 v=v*t%inf; 29 v=v*t%inf; 30 t=t*t; 31 v=(v+(y.a[k][j]-t)*x.a[i][k]%inf)%inf; 32 (s.a[i][j]+=v)%=inf; 33 } 34 return s; 35 } 36 mat mul(ll k){ 37 mat s=a,t=a; 38 k--; 39 while(k>0){ 40 if(k%2)s=s*t; 41 t=t*t;k/=2; 42 } 43 return s; 44 } 45 int main(){ 46 k=read();x=read();x-=read();inf=read(); 47 mem(a.a);a.n=a.m=k; 48 inc(i,1,k)a.a[k][k-i+1]=read(); 49 inc(i,1,k-1) 50 a.a[i][i+1]=1; 51 b.a[k][1]=1; 52 b.n=k;b.m=1; 53 if(x<0){ 54 printf("0\n"); 55 return 0; 56 } 57 tmp=mul(x); 58 b=tmp*b; 59 printf("%lld\n",b.a[k][1]); 60 return 0; 61 }