提交时间:2025-07-05 15:11:43
运行 ID: 38218
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=1e5+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int qp(int a,int b){ int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod;b>>=1; }return res; } inline int add(int a,int b){if((a+=b)>=mod)a-=mod;return a;} namespace Gao { int t[305][305],res[305]; void solve(int n){ up(i,1,n){ int p=i; while(!t[p][i])p++; up(j,1,n+1)swap(t[i][j],t[p][j]); int val=qp(t[i][i],mod-2); up(j,i+1,n){ int v=val*1ll*t[j][i]%mod; up(k,1,n+1)t[j][k]=add(t[j][k],mod-t[i][k]*1ll*v%mod); } } down(i,n,1){ up(j,i+1,n)t[i][n+1]=add(t[i][n+1],mod-t[i][j]*1ll*res[j]%mod); res[i]=t[i][n+1]*1ll*qp(t[i][i],mod-2)%mod; } } } int n,m,q; int prob[305][305][4]; const int dx[]={-1,1,0,0}; const int dy[]={0,0,-1,1}; int val[305][305][305]; void sol(){ memset(Gao::t,0,sizeof(Gao::t)); up(i,1,m)up(j,1,m+1)val[1][i][j]=i==j; up(i,2,n+1){ up(j,1,m){ int iv=qp(prob[i-1][j][1],mod-2); up(k,1,m+1){ val[i][j][k]=val[i-1][j][k]; val[i][j][k]=add(val[i][j][k],mod-val[i-1][j-1][k]*1ll*prob[i-1][j][2]%mod); val[i][j][k]=add(val[i][j][k],mod-val[i-1][j+1][k]*1ll*prob[i-1][j][3]%mod); val[i][j][k]=add(val[i][j][k],mod-val[i-2][j][k]*1ll*prob[i-1][j][0]%mod); } val[i][j][m+1]=add(val[i][j][m+1],mod-1); up(k,1,m+1)val[i][j][k]=val[i][j][k]*1ll*iv%mod; } } up(i,1,m){ up(j,1,m+1)Gao::t[i][j]=val[n+1][i][j]; Gao::t[i][m+1]=(mod-Gao::t[i][m+1])%mod; } Gao::solve(m); int ans=0; up(i,1,n)up(j,1,m){ int res=0; up(k,1,m)res=add(res,val[i][j][k]*1ll*Gao::res[k]%mod); res=add(res,val[i][j][m+1]); ans=add(ans,res); } printf("%d\n",ans); } void slv(){ n=read(),m=read(),q=read(); up(i,1,n)up(j,1,m)up(k,0,3)prob[i][j][k]=read(); sol();while(q--){ int x=read(),y=read(); up(k,0,3)prob[x][y][k]=read(); sol(); } } int main(){ //freopen("support.in","r",stdin),freopen("support.out","w",stdout); slv(); return 0; }