您的位置:首页 > 大数据

矩阵乘法和二分求阶乘 解线性递推问题(大数据的递推)

2013-04-06 14:18 387 查看
题目1081:递推数列时间限制:1 秒内存限制:32 兆特殊判题:否提交:3505解决:412题目描述:给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。输入:输入包括5个整数:a0、a1、p、q、k。输出:第k个数a(k)对10000的模。样例输入:
20 1 1 14 5
样例输出:
8359
注意: 求第k个数对10000的模。 说明数据可能非常大。递推算法提交时TLE, 用矩阵乘法和2分求阶乘!
#include<iostream>#include<fstream>using namespace std;struct rec{	long long int a [3][3];	};rec mutiply(rec r1,rec r2 ) //矩阵相称,确定是二维矩阵 {	rec x;	x.a[1][1]=0;	x.a[1][2]=0;	x.a[2][1]=0; x.a[2][2]=0;	for(int i = 1 ; i<=2; i++)		for(int j = 1 ; j<=2; j++)			for(int k = 1 ; k<=2; k++)				x.a[i][j]=(x.a[i][j]+r1.a[i][k]*r2.a[k][j])%10000;	return x;}rec matrixPow(rec r , int k){	rec temp;	if(k==1) return r;	if(k==2)		return mutiply(r,r);	else	{		if(k%2==0)		{			temp = matrixPow(r ,k/2);			temp = mutiply(temp,temp);			return temp;		}		else		{			temp = matrixPow(r ,k/2);			temp = mutiply(temp ,temp);			temp = mutiply(temp,r);			return temp;		}	}}int main(){	long long int a0,a1,p,q,k;	long long int ak;	//ifstream cin("test.txt"); 	while(cin>>a0>>a1>>p>>q>>k)	{		if(k==0)			cout<<a0%10000<<endl;		if(k==1)			cout<<a1%10000<<endl;		if(k>=2)		{			rec x,xk;			x.a[1][1] = 0;			x.a[1][2]=1;			x.a[2][1] = q;			x.a[2][2] = p;			xk = matrixPow(x,k-1);						cout<<(xk.a[2][1]*a0+xk.a[2][2]*a1)%10000<<endl;		}			}		//system("PAUSE");	return 0;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: