CF1270I Xor on Figures 题解
前言
第一次做这种重定义矩阵+求逆题记录一下,感觉这个题好多人类智慧。
正文
0x00 题目分析
观察题目中的操作可得几个性质。
-
首先一对
\left(p,q\right) 至多操作一次,否则操作次数将会变多。 -
操作具有交换律。
-
操作具有结合律(可以理解为在全
0 矩阵上操作,然后 xor 在一起,最终结果不变)。 -
操作具有自反性。
-
在上述条件下可以推出操作唯一性,即不存在最小化的说法,只需要找出合法操作即可。
0x01 抽象矩阵
为了标示和观察所有的
可以发现一对
显然定义这样的操作为:
若
则
这样即可实现想要的操作。
由于操作自反性且目标为全
也就是:
在重载的定一下找到一个
0x03 矩阵求逆
令单位矩阵为
猜想
-
容易观察到
F^{2^k} 只有F_{2^k\times i\bmod 2^k,2^k\times j\bmod 2^k} 可能有值,即只有F_{0,0} 可能有值且为1 。 -
-
由于原来
F 只有奇数个值,那么F^2 也只能有奇数个值因为若有2\times x_i\equiv 2\times x_j 时,一定会有两个值会被同时异或抵消,这样奇偶数性质不变。
综上可得:
那么
这样得到了一个很劣的时间复杂度
0x04 加速计算
使用类似于快速幂的方法二进制分解
大力观察题目发现
0x05 代码实现
注意不要弄反乘法顺序了,要把
AC CODE
#include<bits/stdc++.h>
// #define ONLINE_JUDGE
#define INPUT_DATA_TYPE long long
#define OUTPUT_DATA_TYPE int
INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){register char s[20];register int i=0;if(x<0){x=-x;putchar('-');}if(x==0){putchar('0');return;}while(x){s[i++]=x%10;x/=10;}while(i){putchar(s[--i]+'0');}return;}
int k,n,mask;
struct MAT{
long long mat[512][512];
void setOne(){
register int i,j;
for(i=0;i<n;++i)
for(j=0;j<n;++j) mat[i][j]=0;
mat[0][0]=1;
return;
}
MAT operator * (MAT another) const{
register int i,j,k,l;
register MAT ans;
ans.setOne();
ans.mat[0][0]=0;
for(i=0;i<n;++i)
for(j=0;j<n;++j)
if(mat[i][j])
for(k=0;k<n;++k)
for(l=0;l<n;++l)
ans.mat[(i+k)&mask][(j+l)&mask]^=mat[i][j]*another.mat[k][l];
return ans;
}
}A,F;
signed main(){
#ifndef ONLINE_JUDGE
freopen("name.in", "r", stdin);
freopen("name.out", "w", stdout);
#endif
register int i,j,x,y,res=0;
k=read();
n=1<<k;
mask=n-1;
for(i=0;i<n;++i)
for(j=0;j<n;++j)
A.mat[i][j]=read();
int q=read();
for(i=0;i<q;++i){
x=read()-1;
y=read()-1;
F.mat[x][y]^=1;
}
for(i=0;i<k;++i){
A=F*A;
F=F*F;
}
for(i=0;i<n;++i)
for(j=0;j<n;++j)
res+=(A.mat[i][j]!=0);
print(res);
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
总结
这种题要观察到其是矩阵异或乘法这样的性质,并分析这样的操作,善于观察才能完成。