题意
坑啊
设a(i,j)表示第i行,第j列的位置上是否需要翻一次,x(i,j)表示i,j这个位置的硬币是否需要翻。
先假设都要翻为0.
那么
a(i,1) xor a(i,2) xor ... xor a(i,n−1) xor a(i,n) xor a(1,j) xor a(2,j) xor ... xor a(i−1,j) xor a(i+1,j) xor ... xor a(n−1,j) xor a(n,j) = x(i,j)
a
(
i
,
1
)
x
o
r
a
(
i
,
2
)
x
o
r
.
.
.
x
o
r
a
(
i
,
n
−
1
)
x
o
r
a
(
i
,
n
)
x
o
r
a
(
1
,
j
)
x
o
r
a
(
2
,
j
)
x
o
r
.
.
.
x
o
r
a
(
i
−
1
,
j
)
x
o
r
a
(
i
+
1
,
j
)
x
o
r
.
.
.
x
o
r
a
(
n
−
1
,
j
)
x
o
r
a
(
n
,
j
)
=
x
(
i
,
j
)
故:
a(i,j)=a(i,1) xor ... xor a(i,j−1) xor a(i,j+1) xor ... xora(i,n) xor a(1,j) xor... xor a(i−1,j) xor a(i+1,j) xor ... xor a(n−1,j) xor a(n,j) xor x(i,j)
a
(
i
,
j
)
=
a
(
i
,
1
)
x
o
r
.
.
.
x
o
r
a
(
i
,
j
−
1
)
x
o
r
a
(
i
,
j
+
1
)
x
o
r
.
.
.
x
o
r
a
(
i
,
n
)
x
o
r
a
(
1
,
j
)
x
o
r
.
.
.
x
o
r
a
(
i
−
1
,
j
)
x
o
r
a
(
i
+
1
,
j
)
x
o
r
.
.
.
x
o
r
a
(
n
−
1
,
j
)
x
o
r
a
(
n
,
j
)
x
o
r
x
(
i
,
j
)
由于n为偶数,各项消掉后得
a(i,j)=x(i,1) xor ... xor x(i,n) xor x(1,j) xor ... xor x(i−1,j) xor x(i+1,j) xor x(n,j)
a
(
i
,
j
)
=
x
(
i
,
1
)
x
o
r
.
.
.
x
o
r
x
(
i
,
n
)
x
o
r
x
(
1
,
j
)
x
o
r
.
.
.
x
o
r
x
(
i
−
1
,
j
)
x
o
r
x
(
i
+
1
,
j
)
x
o
r
x
(
n
,
j
)
翻为1就是n*n-sum(a(i,j)),两者取个min即可
代码
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1001;
int n,a[N][N],x[N][N],r[N],l[N],as[3];
char s[N];
int main(){
int i,j;
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%s",s);
for(j=1;j<=n;++j){
a[i][j]=s[j-1]-'0';
r[i]^=a[i][j];
}
}
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
l[i]^=a[j][i];
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
as[l[j]^r[i]^a[i][j]]++;
if(as[0]<as[1]) printf("%d\n",as[0]);
else printf("%d\n",as[1]);
}