今天的学习有点混乱,反而造成时间更紧迫了。
矩阵快速幂
把矩阵乘积和快速幂结合起来就可以。这一点非常简单,但是这部分题目最难是:
1,判断出题目就是矩阵快速幂来做。 题目:hdoj2276,hdoj4686。
2,根据题目要求推出递推式,并转化为矩阵。 题目:hdoj4686,hdoj5015,hdoj4565。
因为还没读到递推关系和生成函数那一章,矩阵快速幂留了个不该留的尾巴。另外还有hdoj2157这道题方法让我印象深刻。下面简单整理一下吧。
下面部分参考此大佬博客http://blog.csdn.net/wust_zzwh/article/details/52058209
模版:
const int N=10;
int tmp[N][N];
void multi(int a[][N],int b[][N],int n)
{
memset(tmp,0,sizeof tmp);
for(int i=1;i<=n;i++) //按照高代里学的,一行成一列(AB),只要A的行数等于B的列数
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
tmp[i][j]+=a[i][k]*b[k][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=tmp[i][j];
}
int res[N][N];
void Pow(int a[][N],int n) //这里其实就是快速幂。
{
memset(res,0,sizeof res);
for(int i=1;i<=n;i++) res[i][i]=1;
while(n)
{
if(n&1)
multi(res,a,n);//res=res*a;复制直接在multi里面实现了;
multi(a,a,n);//a=a*a
n>>=1;
}
}
hdoj2276 Kiki & Little Kiki 2
转自:http://blog.csdn.net/chenzhenyu123456/article/details/48182051
题意:给你N个围成一圈的灯,1号灯的左边是N号灯,N号灯的右边是1号灯。
这些灯的开关状态在时刻改变,这里给出第i个灯的变化规律(1表示该灯是开着的,0表示该灯是关着的)
这道题确实不好想到用矩阵快速幂,先通过分析灯的变化,推出每个部分灯的变化,最后的出矩阵。其实回看其实也不难。具体的分析上面那位大佬分析的非常到位。感谢大佬。
hdoj2157
转自:http://blog.csdn.net/chenzhenyu123456/article/details/48136727
题意:每次上课都走不同的路线去教室, 但是由于时间问题, 每次只能经过k个地方, 比方说, 这次葱头决定经过2个地方, 那他可以先去问鼎广场看看喷泉,再去教室, 也可以先到体育场跑几圈, 再到教室. 他非常想知道, 从A 点恰好经过k个点到达B点的方案数, 当然这个数有可能非常大, 所以你只要输出它模上1000的余数就可以了.
这道题其实也可以用图论来做,可令我惊讶的是这道题的解和矩阵模型的性质相符合,将图建立邻接矩阵,矩阵的n次幂就是走n步的方案数,据说是属于离散数学的内容,先个学期必须好好听这门课。
关于矩阵快速幂的题目主要还是第二点,我还真是自作自受,进度实在是太慢了,明天至少还要看完递推关系和生成函数,与莫比乌斯反演。后天完成置换群和polya定理。感觉不能在纠结在书本一行一行的看了。明天开始全面加快速度。
下面继续整理补下之前看的知识点。
《初等数论》
1,设a1,a2及c均为正整数,(a1,a2)=1,那么当c>a1a2-a1-a2时,不定方程a1x+a2y=c有非负解,解数等于[c/(a1,a2)]或[c/(a1,a2)]+1,当c=a1a2-a1-a2时,不定方程没有负解。
2,设a1,a2及c均为正整数,(a1,a2)=1,那么当c>a1a2时,方程解a1x+a2y=c解数等于-[-c/(a1a2)]-1或-[-c/(a1,a2)],当c=a1a2时,方程(4)无正解。
3,求5x1+3x2=52的全部正解。
解:x1=8,x2=4一组特解。全部正解是:x1=8+3t,x2=4-5t,-2<=[-8/3]+1<=t<=-[-4/5]-1<=0因此有三个正解。
4,不定方程(x^2)+(y^2)=z^2。。。。。。(1)
设y为偶数,那么解必定x=(r^2)-(s^2),y=2rs,z=(r^2)+(s^2)。
其中r,s为满足条件r>s>0,(r,s)=1,2|r+s。