矩阵乘法

直接上题吧,这东西百度就好了。
fib数列,矩阵快速幂的入门题
题目
输入输出什么的省掉了。

typedef long long ll;
const ll MOD = 1000000007;
struct Mat{
	ll a[2][2];
}I;
void init(Mat& A){
	A.a[0][0] = 0;
	A.a[0][1] = A.a[1][0] = A.a[1][1] =1;            //longlong还是好一点
}
Mat Mul(Mat A,Mat B,ll m){
	Mat ans; 
	memset(ans.a,0,sizeof(ans.a));
	for(int i = 0;i < 2;i++)
		for(int j = 0;j < 2;j++)
			for(int k = 0;k < 2;k++){
				ans.a[i][j] += ((long long)A.a[i][k] * B.a[k][j])%m;
				ans.a[i][j] %= m;
			}
	return ans;
}
Mat Pow(ll n,ll m)
{
	Mat A;
	if(n == 1) return I;
	A = Pow(n/2,m);
	A = Mul(A,A,m);
	if(n&1) A= Mul(A,I,m);
	return A;
}
ll fib(ll n,ll m){
	Mat A;	
	A = Pow(n,m);
	return A.a[0][1];
}

上面是线性递推数列的矩阵板子,下面是一些其他矩阵的灵活运用,我先列表再去刷吧。
生成树统计
日程表安排 这尼玛不就一个组合数学水题吗,我还以为很难
Xn数列

posted @ 2017-05-02 22:40  rsqppp  阅读(151)  评论(0)    收藏  举报