HDU-6470 Count(矩阵快速幂)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chimchim04/article/details/88647157

Count

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 435    Accepted Submission(s): 177

 

Problem Description

Farmer John有n头奶牛.
某天奶牛想要数一数有多少头奶牛,以一种特殊的方式:
第一头奶牛为1号,第二头奶牛为2号,第三头奶牛之后,假如当前奶牛是第n头,那么他的编号就是2倍的第n-2头奶牛的编号加上第n-1头奶牛的编号再加上自己当前的n的三次方为自己的编号.
现在Farmer John想知道,第n头奶牛的编号是多少,估计答案会很大,你只要输出答案对于123456789取模.

Input

第一行输入一个T,表示有T组样例
接下来T行,每行有一个正整数n,表示有n头奶牛 (n>=3)
其中,T=10^4,n<=10^18

Output

共T行,每行一个正整数表示所求的答案

Sample Inpu

5

3

6

9

12

15

 

Sample Output

31

700

7486

64651

527023

Source

“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛

Recommend

liuyiding

f (n) =f (n-1) + 2 f(n-2) + n^3

(n+1)^3=n^3+3*n^2+3*n+1

转置矩阵: 1 1 0 0 0 0
          2 0 0 0 0 0
          1 0 1 0 0 0
          0 0 3 1 0 0
          0 0 3 2 1 0
          0 0 1 1 1 1 

初始矩阵: 2 1 27 9 3 1

代码: 

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define mod 123456789
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const ll N=6;
struct Matrix
{
	ll a[N][N];
	Matrix()
	{
		mem(a,0);
	}
	void init()
	{
		mem(a,0);
		for(ll i=0; i<N; i++)
			a[i][i]=1;
	}
};
void print(Matrix a)
{
	for(ll i=0; i<N; i++)
	{
		for(ll j=0; j<N; j++)
			printf("%d ",a.a[i][j]);
		puts("");
	}
}
Matrix mul(Matrix a,Matrix b)
{
	Matrix ans;
	for(ll i=0; i<N; i++)
		for(ll j=0; j<N; j++)
			for(ll k=0; k<N; k++)
				ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
	return ans;
}
Matrix mat_pow(Matrix a,ll n)
{
	Matrix ans;
	ans.init();
	while(n)
	{
		if(n&1)
			ans=mul(ans,a);
		a=mul(a,a);
		n>>=1;
	}
	return ans;
}
int main()
{
	ll t,n,f1,f2;
	scanf("%lld",&t);
	while(t--)
	{
	    scanf("%lld",&n);
	    if(n==1) printf("1\n");
	    else if(n==2) printf("2\n");
	    else
        {
            ll x[N][N]={1,1,0,0,0,0,
                        2,0,0,0,0,0,
                        1,0,1,0,0,0,
                        0,0,3,1,0,0,
                        0,0,3,2,1,0,
                        0,0,1,1,1,1};
            Matrix A,B;
            A.a[0][0]=2,A.a[0][1]=1,A.a[0][2]=27;
            A.a[0][3]=9,A.a[0][4]=3,A.a[0][5]=1;
            for(int i=0;i<N;i++)
                for(int j=0;j<N;j++)
                B.a[i][j]=x[i][j];
            Matrix p=mat_pow(B,n-2);
            Matrix ans=mul(A,p);
            printf("%lld\n",ans.a[0][0]);
        }
	}
	return 0;
}


 

猜你喜欢

转载自blog.csdn.net/chimchim04/article/details/88647157