HDU 2256 Problem of Precision (矩阵快速幂+ 化简 +向下取整)

Problem of Precision

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1565    Accepted Submission(s): 951


Problem Description

 

Input
The first line of input gives the number of cases, T. T test cases follow, each on a separate line. Each test case contains one positive integer n. (1 <= n <= 10^9)
 

Output
For each input case, you should output the answer in one line.
 

Sample Input
3 1 2 5
 

Sample Output
9 97 841
 






代码如下:


#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <stdio.h>
#include <cmath>
#include <string>
#include <stack>

typedef long long ll;

const int MOD=1024;
const int N =20;
const int MAXN=2;
using namespace std;

struct Matrix{
	ll arr[N][N];
	void init()
	{
		memset(arr,0,sizeof(arr));
		for(int i=0;i<MAXN;i++)
			arr[i][i]=1;//初始化
	}
	void iinit()
	{
	    memset(arr,0,sizeof(arr));
	    arr[0][0]=arr[1][1]=5;
	    arr[0][1]=12;
	    arr[1][0]=2;
	}
}A;
Matrix mul(Matrix X,Matrix Y)// 矩阵乘法
{
	Matrix ans;
	for(int i=0;i<MAXN;i++)
		for(int j=0;j<MAXN;j++){
			ans.arr[i][j]=0;
			for(int k=0;k<MAXN;k++){
				ans.arr[i][j]+=X.arr[i][k]*Y.arr[k][j];
			ans.arr[i][j]%=MOD;
			}
		}
	return ans;
}
Matrix Q_pow(Matrix B,int n)// 矩阵快速幂
{
	Matrix ans;
	ans.init();
	while(n)
	{
		if(n&1)
			ans=mul(ans,B);
		n>>=1;
		B=mul(B,B);
	}
	return ans;
}
Matrix Add(Matrix a,Matrix b)  //(a+b)%mod 矩阵加法
{
    int i,j,k;
    Matrix ans;
    for(i=0;i<MAXN;i++)
        for(j=0;j<MAXN;j++)
        {
            ans.arr[i][j]=a.arr[i][j]+b.arr[i][j];
            ans.arr[i][j]%=MOD;
        }
    return ans;
}
Matrix Sum(Matrix a,int n)// 矩阵和
{
	int m;
	Matrix ans,pre;
	if(n==1) return ans;
	m=n/2;
	pre=Sum(a,m);
	ans=Add(pre,mul(pre,Q_pow(a,m)));
	if(n&1)
		ans=Add(ans,Q_pow(a,n));
	return ans;
}

int main()
{
    int T;
    cin>>T;
    int n;
    while(T--)
    {
        scanf("%d",&n);
        Matrix ans;
        ans.iinit();
        if(n==1)
        {
            printf("9\n");
            continue;
        }
        ans=Q_pow(ans,n-1);
        ll res=0;
        //cout<<ans.arr[0][0]<<" "<<ans.arr[0][1]<<" "<<endl;
        res=(ans.arr[0][0]*5+ans.arr[0][1]*2)%MOD;
        printf("%lld\n",(2*res-1)%MOD);
    }
    return 0;
}


posted @ 2017-08-12 11:01  Sizaif  阅读(164)  评论(0编辑  收藏  举报