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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| #include<iostream> #include<cstring> using namespace std;
typedef long long ll; const int N=100+5,MOD=1000000007,G=24;
struct Matrix{ ll m[N][N]; Matrix(){ memset(m,0,sizeof(m)); } void Diag(){ for(int i=0;i<N;i++)m[i][i]=1; } Matrix operator*(const Matrix &b)const{ Matrix ret; for(int i=0;i<N;i++) for(int j=0;j<N;j++) for(int k=0;k<N;k++) ret.m[i][j]=(ret.m[i][j]+m[i][k]*b.m[k][j])%MOD; return ret; } Matrix operator^(const int &t)const{ Matrix bas=*this,ret; ret.Diag(); for(int i=t;i;i>>=1,bas=bas*bas) if(i&1)ret=ret*bas; return ret; } };
ll QPow(ll bas,ll t){ ll ret=1;bas%=MOD; for(;t;t>>=1,bas=bas*bas%MOD) if(t&1LL)ret=ret*bas%MOD; return ret; }
int Inv(ll x){ return QPow(x,MOD-2); }
int m,n,r[2],nMon,t; bool mon[G][N][N]; Matrix mat[G][2],gcd[2];
inline int Id(int r,int c){ return r*m+c; }
inline ll Abs(int x){ return x>0?x:-x; }
inline int Dis(int x1,int y1,int x2,int y2){ return Abs(x1-x2)+Abs(y1-y2); }
int main(){ ios::sync_with_stdio(0);
cin>>n>>m>>r[0]>>r[1]>>nMon>>t; for(int i=1,x1,x2,y1,y2;i<=nMon;i++){ cin>>x1>>y1>>x2>>y2; if(x1==x2){ int dir=1,y=y1; for(int j=0;j<G;j++){ mon[j][x1][y]=1; int _y=y+dir; if(_y>max(y1,y2)||_y<min(y1,y2))dir*=-1; if(y1!=y2)y=y+dir; } }else{ int dir=1,x=x1; for(int j=0;j<G;j++){ mon[j][x][y1]=1; int _x=x+dir; if(_x>max(x1,x2)||_x<min(x1,x2))dir*=-1; if(x1!=x2)x=x+dir; } } }
for(int d=0;d<=1;d++){ gcd[d].Diag();
for(int i=0;i<G;i++){ for(int j=0;j<n;j++) for(int k=0;k<m;k++){ if(mon[i][j][k])continue;
int cnt=0; for(int p=0;p<n;p++) for(int q=0;q<m;q++){ if(mon[(i+1)%G][p][q])continue; if(Dis(j,k,p,q)<=r[d])cnt++; }
int inv=Inv(cnt); for(int p=0;p<n;p++) for(int q=0;q<m;q++){ if(mon[(i+1)%G][p][q])continue; if(Dis(j,k,p,q)<=r[d]) mat[i%G][d].m[Id(j,k)][Id(p,q)]=inv; } }
gcd[d]=gcd[d]*mat[i][d]; } }
Matrix vec[2]; vec[0].m[0][0]=1;vec[1].m[0][Id(n-1,m-1)]=1;
for(int i=0;i<=1;i++){ vec[i]=vec[i]*(gcd[i]^(t/G)); for(int j=0;j<(t%G);j++) vec[i]=vec[i]*mat[j][i]; }
ll ans=0; for(int i=0;i<n*m;i++) ans=(ans+vec[0].m[0][i]*vec[1].m[0][i]%MOD)%MOD;
cout<<ans;
return 0; }
|