提交时间:2024-10-04 19:12:46
运行 ID: 33270
#include <bits/stdc++.h> using namespace std; #define endl "\n" #define int long long #define pii pair<int,int> vector<int>A; vector<int>p[2003000]; int g[110][110]; bool vis[2003000]; const int B=170; int n,m,T; const int M=1e9+7; inline int qp(int a,int x){ // cout<<a<<" "<<x<<endl; int res=1; while(x){ if(x&1)res=res*a%M; a=a*a%M; x>>=1; } return res; } inline int inv(int x){return qp(x,M-2);} int G[210][110][110]; int res=0; int NOW[110],P[110]; inline int tims(int k){ memcpy(P,NOW,sizeof(P)); memset(NOW,0,sizeof(NOW)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) NOW[j]=(NOW[j]+P[i]*G[k][i][j])%M;//,cout<<NOW[j]<<" "<<P[i]<<endl; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); // freopen("genshin.in","r",stdin); // freopen("genshin.out","w",stdout); cin>>n>>m>>T; for(int i=1;i<=n;i++){ int ct=0; for(int j=1;j<=n;j++){ char x; cin>>x; if(x=='1')g[i][j]=1,ct++; } for(int j=1;j<=n;j++) g[i][j]=g[i][j]*inv(ct)%M; G[0][i][i]=1; } // for(int i=1;i<=n;i++,cout<<endl) // for(int j=1;j<=n;j++) // cout<<g[i][j]<<" "; // cout<<endl; for(int _=1;_<=B;_++){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) G[_][i][k]=(G[_][i][k]+G[_-1][i][j]*g[j][k])%M; } vis[T]=1; for(int i=B;i<=T;i+=B)vis[i]=1; for(int i=1;i<=m;i++){ int t,u; cin>>t>>u; vis[t]=1; p[t].push_back(u); } for(int i=1;i<=T;i++)if(vis[i])A.push_back(i); int now=0; int res=0; for(int x:A){ int d=x-now; for(int i=1;i<d;i++){ int r=0; for(int j=1;j<=n;j++) r=(r+NOW[j]*G[i][j][n])%M; res^=r; } tims(d); now=x; for(int y:p[x])(NOW[y]+=1)%=M; // cout<<now<<endl; // for(int i=1;i<=n;i++) // cout<<NOW[i]<<" "; // cout<<endl; res^=NOW[n]; } cout<<res<<endl; cout.flush(); return 0; }