Codeforces1270I Xor on Figures
Description
有一个 的矩阵 ,行列从 开始标号,有两个长度为 的序列 。
你需要通过若干次操作使得整个矩阵 全为 。
一次操作需要三个参数 ,会给所有 异或上 。
求最小的操作次数。
且 为奇数。
Solution
设矩阵 满足在所有 处值为 而其它位置为
考察一下题目中给出的操作的形式和二维循环卷积是类似的,那么可以定义一种新的乘法:
此时问题变成了找到一个矩阵 满足 ,其中 是题目中给定的矩阵
观察到上面定义的 矩阵在进行乘方运算时在异或运算的配合下有非常好的性质:除了自乘之外所有乘法结果会被 两次,也就是说 满足在且仅在 处为
那么不难发现 ,暴力进行乘法即可
注意到 中只有 个元素有值,复杂度就是
Code
const int N=512;
int k,n,m,a[N][N],f[2][N][N];
int x[N],y[N];
signed main(){
k=read(); n=(1<<k);
int cur=0;
for(int i=0;i<n;++i) for(int j=0;j<n;++j) f[cur][i][j]=read();
m=read();
rep(i,1,m) x[i]=read()-1,y[i]=read()-1;
for(int e=0;e<k;++e){
for(int i=0;i<n;++i) for(int j=0;j<n;++j) f[cur^1][i][j]=0;
for(int t=1;t<=m;++t){
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
f[cur^1][(i+x[t])&(n-1)][(j+y[t])&(n-1)]^=f[cur][i][j];
}
}
}
rep(i,1,m) x[i]=(x[i]*2)&(n-1),y[i]=(y[i]*2)&(n-1);
cur^=1;
}
int ans=0;
for(int i=0;i<n;++i) for(int j=0;j<n;++j) if(f[cur][i][j]) ++ans;
print(ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律