#10. 猜序列

猜序列

Description

zty提出了一个奇怪的问题。

对于一个数列,若你每次选择区间[i,j],则你会花费Ai,jA_{i,j}的代价,得知AiAi+1......AjA_i⊕A_{i+1}⊕......⊕A_j的值。问至少花费多少代价,可以知道序列中的每一个数。

Input

第一行一个正整数,表示数列的长度。 。

接下来输入nn行,每行nn个整数。其中第ii行第jj个数为Ai,jA_{i,j},其含义见题目描述。

Output

输出一个整数,表示知道序列中每一个数的最小代价。

Samples

5
4 5 4 5 3 
2 3 1 5 2 
3 2 4 4 3 
4 2 4 5 0 
2 0 3 5 0
4
8
9662 17411 12297 3755 25882 15231 22822 21468 
1584 28544 15255 25709 4878 23151 24176 2099 
23816 19934 15431 16765 18174 9153 32661 10220 
1245 4059 24160 25989 29800 9590 22807 2565 
29497 25943 24766 10356 22018 26609 10314 29437 
25881 30681 9551 18685 564 12410 984 27482 
23409 29962 4502 19222 20377 21437 25662 9764 
26533 10552 16172 26234 2433 6216 31820 30567
15976

tips

【样例一解释】

一种最优的方案:选择区间【5,5】【5,2】【4,5】【2,1】【5,1】。

由区间【5,1】【5,2】可知序列中第一个数。

由于已知第一个数,结合区间【2,1】可知第二个数。

由区间【5,5】可知第五个数的大小。

由于已知第五个数,结合区间【4,5】可知第四个数。

由于已知第一、二、四、五个数,结合区间【1,5】可知第三个数。

此时代价总和为0+0+0+2+2=4。可以证明,4为最小的代价。

【样例二解释】

我有个绝妙的解释,可惜写不下。

【温习】 异或

异或是信息学竞赛中常见的考察点,符号为。其通俗的表示为:相同则为假,相反则为真。

例如xx的二进制表示是01010101yy的二进制表示是10111011,则xy=1110x⊕y=1110。(按位对齐后每一位进行异或。xx的最低位与yy的最低位相同,异或结果对应为00,第二位不同,结果对应为11,其余同理)

显然异或满足交换律:xy=yxx⊕y=y⊕x

显然其也满足自反性:xx=0x⊕x=0

显然有x0=xx⊕0=x

数列AlA_l~ArA_r的异或和即AlAl+1...Ar1ArA_l⊕A_{l+1}⊕...⊕A_{r-1}⊕A_r。特别地,当l=rl=r时,异或和为Al(Ar)A_l(A_r)本身。

在C++语言中,我们用^表示异或。以下代码:

c = a ^ b;

其含义为:将aabb异或的结果赋给cc

【数据范围及约定】

本题共有1010个测试点,每个测试点10分,共100分。各测试点性质如下:

对于测试点11n4n\le 4

对于测试点22~33n7n\le 7

对于测试点44:输入保证AA矩阵中的每个数都相等。

对于测试点55:输入保证AA矩阵递增,即Ai,j>Ai,j1A_{i,j}>A_{i,j-1},且Ai,1>Ai1,nA_{i,1}>A_{i-1,n}

对于测试点11~1010n1000n\le 10000Bi,j1×1090\le B_{i,j}\le 1\times 10^9。不保证输入数据满足Ai,j=Aj,iA_{i,j}=A_{j,i}