ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[cf1270I]Xor on Figures

2021-03-12 15:04:07  阅读:204  来源: 互联网

标签:Xor 复杂度 矩阵 cf1270I Figures bigoplus otimes mod equiv


考虑一个构造:令初始$2^{k}\times 2^{k}$的矩阵为$A$(下标从0开始),再构造一个矩阵$T$,满足仅有$T_{x_{i},y_{i}}=1$(其余位置都为0),定义矩阵卷积$\otimes$即
$$
(A\otimes B)_{x,y}=\bigoplus_{x_{1}+x_{2}\equiv x(mod\ 2^{k}),y_{1}+y_{2}\equiv y(mod\ 2^{k})}A_{x_{1},y_{1}}B_{x_{2},y_{2}}
$$
(不难证明这个卷积运算有交换律和结合律)

令$F$为答案矩阵,即$F_{x,y}$为在$(x,y)$上所选择的$p$(多次选择异或起来即可),根据定义有$F\otimes T=A$

考虑$\otimes$运算的单位矩阵$e$,即满足对于任意矩阵$A$,$A\otimes e=A$,不难发现$e_{x,y}=[x=0][y=0]$即满足此条件,以下即以此为单位矩阵

通过单位矩阵,我们就可以对矩阵$T$求逆了,若其求逆结果为$T^{-1}$(即满足$T\otimes T^{-1}=e$的矩阵因此),将上式两边同乘$T^{-1}$即有$F=A\otimes T^{-1}$

考虑如何求出$T^{-1}$,似乎并不太好求,那么再考虑一个问题,即$T^{2}$(即$T\otimes T$)是一个怎样的矩阵:

根据定义中的式子,注意到当交换$x_{1}$和$x_{2}$、$y_{1}$和$y_{2}$后,两者所贡献的位置以及权值相同,而$\oplus$具有自反性,因此即最终结果为0

但特别的,当$x_{1}=x_{2}$且$y_{1}=y_{2}$,显然是不能交换的,即
$$
(T^{2})_{x,y}=\bigoplus_{2x'\equiv x(mod\ 2^{k}),2y'\equiv y(mod\ 2^{k})}T_{x',y'}^{2}=\bigoplus_{2x'\equiv x(mod\ 2^{k}),2y'\equiv y(mod\ 2^{k})}T_{x',y'}
$$
(最后一步由于$T$中任意元素都为0或1,因此$T_{x',y'}^{2}=T_{x',y'}$)

上面这个式子通俗的来说,也就是将$T$中的每一个在$(x,y)$的1都移动到$(2x\ mod\ 2^{k},2y\ mod\ 2^{k})$,当一个位置有两个1可以相互抵消

当然我们也可以先不抵消,重复上述过程,则有
$$
(T^{2^{k}})_{x,y}=\bigoplus_{2^{k}x'\equiv x(mod\ 2^{k}),2^{k}y'\equiv y(mod\ 2^{k})}T_{x',y'}=[x=0][y=0]\bigoplus_{x,y}T_{x,y}=[x=0][y=0][t\ mod\ 2]
$$
(显然$T$中1的个数恰好为$t$)

根据$t$是奇数,即$T^{2^{k}}=e$,那么$T\otimes T^{2^{k}-1}=e$,即$T^{-1}=T^{2^{k}-1}$

关于如何计算$A\otimes T^{2^{k}-1}$,如果暴力计算两个矩阵复杂度是$o(2^{4k})$,即使用快速幂优化$T^{2^{k}-1}$的计算,复杂度也是$o(k2^{4k})$,无法通过

但是,注意到$\forall 0\le i\le k,T^{2^{i}}$至多只有$t$个1(即使移动到的位置都不重合,没有抵消)

根据$2^{k}-1=\sum_{i=0}^{k-1}2^{i}$,再根据结合律所求即$A\otimes T^{1}\otimes T^{2}\otimes...\otimes T^{2^{k-1}}$,按照运算顺序从左到右依次乘,每一次复杂度为$o(t2^{2k})$,总复杂度即$o(tk2^{2k})$

(每一个$T^{2^{i}}$怎么求前面应该也已经说明了)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 2005
 4 int n,m,ans,x[N],y[N];
 5 long long a[N][N],b[N][N];
 6 void mul(){
 7     memset(b,0,sizeof(b));
 8     for(int i=0;i<(1<<n);i++)
 9         for(int j=0;j<(1<<n);j++)
10             for(int k=1;k<=m;k++)b[(x[k]+i)%(1<<n)][(y[k]+j)%(1<<n)]^=a[i][j];
11     memcpy(a,b,sizeof(a));
12 }
13 int main(){
14     scanf("%d",&n);
15     for(int i=0;i<(1<<n);i++)
16         for(int j=0;j<(1<<n);j++)scanf("%lld",&a[i][j]);
17     scanf("%d",&m);
18     for(int i=1;i<=m;i++)scanf("%d%d",&x[i],&y[i]);
19     for(int i=0;i<n;i++){
20         mul();
21         for(int j=1;j<=m;j++){
22             x[j]=2*x[j]%(1<<n);
23             y[j]=2*y[j]%(1<<n);
24         }
25     }
26     for(int i=0;i<(1<<n);i++)
27         for(int j=0;j<(1<<n);j++)
28             if (a[i][j])ans++;
29     printf("%d",ans);
30 }
View Code

 

标签:Xor,复杂度,矩阵,cf1270I,Figures,bigoplus,otimes,mod,equiv
来源: https://www.cnblogs.com/PYWBKTDA/p/14523927.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有