6
2025-01-16 20:23:45
发布于:浙江
#include<bits/stdc++.h>
using namespace std;
#define MAXN 105
#define LL long long
#define ULL unsigned long long
#define ENDL putchar('\n')
#define DB double
#define lowbit(x) (-(x) & (x))
#define FI first
#define SE second
#define PR pair<int,int>
#define UIN unsigned int
int xchar() {
static const int maxn = 1000000;
static char b[maxn];
static int pos = 0,len = 0;
if(pos == len) pos = 0,len = fread(b,1,maxn,stdin);
if(pos == len) return -1;
return b[pos ++];
}
// #define getchar() xchar()
inline LL read() {
LL f = 1,x = 0;int s = getchar();
while(s < '0' || s > '9') {if(s<0)return -1;if(s=='-')f=-f;s = getchar();}
while(s >= '0' && s <= '9') {x = (x<<1) + (x<<3) + (s^48);s = getchar();}
return f*x;
}
void putpos(LL x) {if(!x)return ;putpos(x/10);putchar((x%10)^48);}
inline void putnum(LL x) {
if(!x) {putchar('0');return ;}
if(x<0) putchar('-'),x = -x;
return putpos(x);
}
inline void AIput(LL x,int c) {putnum(x);putchar(c);}
const int MOD = 1000000007;
int n,m,s,o,k;
void MD(int &x) {if(x>=MOD)x-=MOD;}
struct mat{
int s[60][60],n,m;
mat(){memset(s,0,sizeof(s));n=m=0;}
}G,dp0[65],pw0[65],dpl[65],dpr[65];
inline mat operator * (mat a,mat b) {
mat c; c.n = a.n; c.m = b.m;
for(int i = 0;i < a.n;i ++) {
for(int k = 0;k < a.m;k ++) {
if(a.s[i][k])
for(int j = 0;j < b.m;j ++) {
c.s[i][j] = (c.s[i][j] + a.s[i][k]1llb.s[k][j]) % MOD;
}
}
} return c;
}
inline mat operator + (mat a,mat b) {
for(int i = 0;i < a.n;i ++) {
for(int j = 0;j < a.m;j ++) {
MD(a.s[i][j] += b.s[i][j]);
}
} return a;
}
inline mat& operator += (mat &a,mat b) {
for(int i = 0;i < a.n;i ++) {
for(int j = 0;j < a.m;j ++) {
MD(a.s[i][j] += b.s[i][j]);
}
} return a;
}
int main() {
n = read(); k = read(); m = read();
G.n = G.m = n;
for(int i = 0;i <= k;i ++) dp0[i].n = dp0[i].m = n;
for(int i = 1;i <= n;i ++) {
for(int j = 1;j <= n;j ++) {
char c = getchar();
while(c == ' ' || c == '\n') c = getchar();
G.s[i-1][j-1] = c^48;
}
}
mat mt0 = mat();
mt0.n = mt0.m = n;
mat mt1 = mt0,ml0 = mat(),mr0 = mat();
ml0.n = 1; ml0.m = n;
mr0.n = n; mr0.m = 1;
for(int i = 0;i < n;i ++) mt1.s[i][i] = 1;
dp0[1] = G; pw0[1] = dp0[1] * dp0[1];
for(int i = 2;i <= k;i ++) {
dp0[i] = pw0[i-1] + G;
pw0[i] = dp0[i] * dp0[i];
pw0[i] += pw0[i-1];
}
while(m --) {
s = read(); int S = read();
o = read(); int T = read();
if(s > o) swap(s,o);
for(int i = 1;i <= k;i ++) dpl[i] = ml0,dpr[i] = mr0;
dpl[s].s[0][S-1] = 1; dpr[o].s[T-1][0] = 1;
for(int i = s;i <= k;i ++) {
mat nm = dpl[i] * dp0[i];
for(int j = i+1;j <= k;j ++) dpl[j] += nm;
}
for(int i = o;i <= k;i ++) {
mat nm = dp0[i] * dpr[i];
for(int j = i+1;j <= k;j ++) dpr[j] += nm;
}
mat as = dpl[o] * dpr[o];
for(int i = o+1;i <= k;i ++) as += dpl[i] * dpr[i];
AIput(as.s[0][0],'\n');
}
return 0;
}
全部评论 11
2025-07-10 来自 北京
0我抄怎么了?跟你自己抄有什么关系?
2025-07-11 来自 浙江
0义务教育学完了吗?话都听不懂
2025-07-11 来自 浙江
0
你说是我先骂的你,但我就不明白你发完还删是什么意思,你说,然后我再看一遍做一遍不就完了
2025-07-10 来自 北京
0笑死,你不骂我不就完了,自己喜欢叫
2025-07-11 来自 浙江
0
装什么清高
2025-07-10 来自 北京
0而且你题解不也是抄的吗
2025-07-10 来自 北京
0我跟你吵算我脑子有问题行吧
2025-07-10 来自 北京
0你终于承认了
2025-07-11 来自 浙江
0
你骂来骂去也就那几句话
2025-07-10 来自 北京
0就凭你这个垃圾,浮木跟tm似了一样的抖M,你的老师不会让你刷黑题的
2025-07-10 来自 北京
0一律反弹
2025-07-11 来自 浙江
0对了,你自拍一张都是全家福哦
2025-07-11 来自 浙江
0
但是我只是在我的题错了之后不知道错哪才看的题解,别问我为什么没有答题记录,我在DEV里试过了,你也只是纯抄题解吧
2025-07-10 来自 北京
0是你提出的质疑没错
2025-07-10 来自 北京
0你要骂赶快骂行吧
2025-07-10 来自 北京
0sb
2025-07-11 来自 浙江
0所以呢
2025-07-11 来自 浙江
0
我不想在这里人身攻击什么的
2025-07-10 来自 北京
0哇撒,好文明啊,这么文明还骂
2025-07-11 来自 浙江
0谁说出生率低了,我看你这种出生挺多的
2025-07-11 来自 浙江
0就算你是直肠子,也不用张嘴就拉啊是吧
2025-07-12 来自 北京
0
有帮助,赞一个