今天主要做了做总结,先是自己做总结,然后下午和做数学的同学一块做了总结和讨论,感觉是很好的过程,每个人都更清楚了自己的不足,知道自己接下来该多去看什么,大家也能更好地统一进度,接下来我要看Polya定理的更多题型,莫比乌斯也要进一步理解,然后组合数学之前的东西也要再回顾一下。
贴一下部分总结:
高斯消元
高斯消元法就是求解线性方程组的一个方法,方法本身是一个模板性方法,具体步骤:由原线性方程组得到增广矩阵,用高斯消元法得到下三角或上三角形式的矩阵,由先得到的解带入其余方程的除所有解。
一般要用列选主元消元法 ,比如当前要处理第i行,那么要用aii去消去同列元素,aii就是主元,此时在没处理过的行中选第i列绝对值最大的那个行与当前行交换,用交换后的主元去消除同列其他元素,可以减小运算的误差。
还注意判断无解的情况。
有一大类题型就是求解异或方程组,经典题型就是开关灯,用异或XOR做的:Poj 1222 EXTENDED LIGHTS OUT,给你一个5*6的格子,每个格子中有灯(亮着1,暗着0),每次你可以把一个暗的点亮(或者亮的熄灭)然后它上下左右的灯也会跟着变化。最后让你把所有的灯熄灭,问你应该改变哪些灯。
题目就是开始给一个01矩阵代表对应点的初始状态,每个点可以改变状态,而且这个点状态的改变会影响其他点,求改变哪些点能将所给矩阵的点全变为0,怎么把这个状态矩阵转化为方程组再转化为矩阵,
其实相当于对于每个点解一个方程:
初始的状态 XOR 自己操作没操作 XOR 周围的四个点操作没操作 (对本点有影响的点变操作没操作) = 目标状态 (全为0)
两边同时XOR之前的状态。
自己操作没操作 XOR 周围的四个点操作没操作 = 初始的状态
得到关于每个点的一个方程:ai1*x1 xor ai2*x2 xor ai3*x3 xor ...xor ain*xn = bi
所以对于一个方程,常数bi是之前的初始状态即输入的状态
Xi是对每个灯操作与否,1为操作,0不操作,是要解出的答案。
a(i,j)是灯j的开关对i的影响,是需要自己求的数组。
总共n*m个点,即得到n*m个方程,即可得到(n*m)*(n*m)系数矩阵,增广矩阵为(n*m)*(n*m+1),注意题给的灯的初始状态n*m矩阵,与这里方程矩阵的区别。
解异或方程组思想与解普通线性方程组思想相同,原理不同?。利用1 xor 1=0,还没仔细看。
for(inti=m*n;i>=1;i--)
{
x[i]=a[i][m*n+1];
if(!x[i])
continue;
for(int j=i-1;j>=1;j--)
if(a[j][i])
a[j][m*n+1]^=x[i];
}