【矩阵快速幂】数列

[NOIP模拟赛]数列

【题目描述】
  a[1]=a[2]=a[3]=1
  a[x]=a[x-3]+a[x-1] (x>3)
  求a 数列的第n 项对1000000007(10^9+7)取余的值。

【输入格式】
  第一行一个整数T,表示询问个数。
  以下T 行,每行一个正整数n。

【输出格式】
  每行输出一个非负整数表示答案。

【样例输入】
3
6
8
10

【样例输出】
4
9
19

【数据范围】
  对于30%的数据 n<=100;
  对于60%的数据 n<=2*10^7;
  对于100%的数据 T<=100,n<=2*10^9;

试题分析:60%直接递推就好

     至于100%的就用矩阵快速幂。

     0 1 0              1

     0 0 1 ^ (k-2) * 1

     1 0 1              1

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
	for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
	return x*f;
}
#define LL long long
LL m1[7][7];
LL m2[7][7];
LL m3[7][7];
int N;
const int mod=1000000007;

void cheng(){
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++)
		    m2[i][j]=m3[i][j];
	}
	memset(m3,0,sizeof(m3));
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			for(int k=1;k<=N;k++)
			    m3[i][j]+=m2[i][k]*m1[k][j]%mod,m3[i][j]%=mod;
		}
	}
}
void cheng2(){
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++)
		    m2[i][j]=m1[i][j];
	}
	memset(m1,0,sizeof(m1));
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			for(int k=1;k<=N;k++)
			    m1[i][j]+=m2[i][k]*m2[k][j]%mod,m1[i][j]%=mod;
		}
	}
}
void Pow(int b){
	while(b){
		if(b&1) cheng();
		b>>=1;
		cheng2();
	}
	return ;
}
void chengk(){
	for(int a=1;a<=3;a++)
	    for(int b=1;b<=1;b++)
	        for(int c=1;c<=3;c++)
	            m1[a][b]+=m3[a][c]*m2[c][b]%mod,m1[a][b]%=mod;
	return;
}
int main(){
	int T=read();
	while(T--){
		int k=read(); N=3;
		memset(m1,0,sizeof(m1));
		memset(m3,0,sizeof(m3));
		m1[1][2]=m3[1][2]=1;
		m1[2][3]=m3[2][3]=1;
		m1[3][1]=m3[3][1]=1;
		m1[3][3]=m3[3][3]=1;
		Pow(max(k-2,0));
		memset(m1,0,sizeof(m1));
		m2[1][1]=1,m2[2][1]=1,m2[3][1]=1;
		chengk();
		printf("%lld\n",m1[1][1]%mod);
	}
}
时间: 2024-11-09 01:37:52

【矩阵快速幂】数列的相关文章

[矩阵快速幂] 数列(类斐波那契

数列 题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] 求a数列的第n项对1000000007(10^9+7)取余的值. 输入 第一行一个整数T,表示询问个数. 以下T行,每行一个正整数n. 输出 每行输出一个非负整数表示答案. 样例输入 3 6 8 10 样例输出 4 9 19 提示 对于30%的数据 n<=100: 对于60%的数据 n<=2*10^7: 对于100%的数据 T<=100,n<=2*10^9: emmm基本就是一道矩阵快速幂的裸题

HDU 4549 M斐波那契数列(矩阵快速幂)

Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据: 每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模

hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速幂来解,不用说肯定wa,看题目的通过率也不高,我想会不会有啥坑啊.然而我就是那大坑,哈哈. 不说了,直接说题吧,先讨论k=1,2,3;时的解.这应该会解吧,不多说了: 从第四项开始f(4)=a^1+b^2;f(5)=a^2+b^3;f(6)=a^3+b^5......; 看出来了吧,a上的指数成斐波

poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)

题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数.如果后四位全为0,则输出0,否则 输出后四位去掉前导0,也...就...是...说...输出Fn%10000. 题目说的如此清楚..我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后 去掉前导0.o(╯□╰)o 还有矩阵快速幂的幂是0时要特判. P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶! #include<cstdio> #include<iostream>

nyoj_148_fibonacci数列(二)_矩阵快速幂

fibonacci数列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … An alterna

HDU 4549 M斐波那契数列(矩阵快速幂&amp;费马小定理)

ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u 题意 Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2]

HDOJ 4549 M斐波那契数列 费马小定理+矩阵快速幂

MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i )   ( i>=3) mod 1000000007 是质数 , 根据费马小定理  a^phi( p ) = 1 ( mod p )  这里 p 为质数 且 a 比 p小 所以 a^( p - 1 ) = 1 ( mod p ) 所以对很大的指数可以化简  a ^ k % p  == a ^ ( k %(p-1) ) % p 用矩阵快速幂求fib数后代入即可 M斐波那契数列 Time Limit: 3000/1000

fibonacci数列(二)_矩阵快速幂

描述 In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … An alternative formula for the Fibonacci sequence is . Given

M斐波那契数列(矩阵快速幂+费马小定理)

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1672    Accepted Submission(s): 482 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a,

HDOJ M斐波那契数列 4549【矩阵快速幂+快速幂+费马小定理+欧拉函数】

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2096    Accepted Submission(s): 596 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给