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
| #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<set> #include<bitset> #define inc(i,l,r) for(int i=l;i<=r;i++) #define dec(i,l,r) for(int i=l;i>=r;i--) #define link(x) for(edge *j=h[x];j;j=j->next) #define mem(a) memset(a,0,sizeof(a)) #define ll long long #define eps 1e-12 #define succ(x) (1LL<<(x)) #define lowbit(x) (x&(-x)) #define sqr(x) ((x)*(x)) #define mid ((x+y)>>1) #define NM 50005 #define nm 11 #define pi 3.1415926535897931 const ll inf=1e9+7; using namespace std; ll read(){ ll x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return f*x; }
char _s[NM][nm]; int n,m,_t,_x,_y;
struct mat{int n,m;ll a[nm][nm];}; mat operator*(const mat&a,const mat&b){ mat s;mem(s.a);s.n=a.n;s.m=b.m; inc(i,1,s.n)inc(k,1,a.m)inc(j,1,s.m)(s.a[i][j]+=a.a[i][k]*b.a[k][j])%=inf; return s; }
struct node{ int x,y; node*l,*r; mat s; void upd(){s=l->s*r->s;} node(int x,int y,node*l=0,node*r=0):x(x),y(y),l(l),r(r){ s.n=s.m=m; if(x==y){ inc(i,1,m)if(_s[x][i]=='0'){ s.a[i][i]=1; for(int j=i-1;s.a[j][j]==1;j--)s.a[j][i]=s.a[i][j]=1; } } else upd(); } void mod(){ if(x==y){ int l,r; for(l=_y-1;s.a[l][l]==1;l--);l++; for(r=_y+1;s.a[r][r]==1;r++);r--; if(s.a[_y][_y]==1){ inc(i,l,_y)inc(j,_y,r)s.a[i][j]=0; inc(i,_y,r)inc(j,l,_y)s.a[i][j]=0; }else{ inc(i,l,_y)inc(j,_y,r)s.a[i][j]=1; inc(i,_y,r)inc(j,l,_y)s.a[i][j]=1; } return; } if(_x<=mid)l->mod();else r->mod();upd(); } }*root; node*build(int x,int y){return x==y?new node(x,y):new node(x,y,build(x,mid),build(mid+1,y));}
int main(){ n=read();m=read();int _=read(); inc(i,1,n)scanf("%s",_s[i]+1); root=build(1,n); while(_--){ _t=read();_x=read();_y=read(); if(_t==1){ root->mod(); }else{ mat t; mem(t.a);t.n=1;t.m=m;t.a[1][_x]=1; t=t*root->s; printf("%lld\n",t.a[1][_y]); } } return 0; }
|