AcWing 1303. 斐波那契前 n 项和 (矩阵乘法)

题意

大家都知道 Fibonacci 数列吧,$f_1=1,f_2=1,f_3=2,f_4=3,…,f_n=f_{n−1}+f_{n−2}$。

现在问题很简单,输入 $n$ 和 $m$,求 ${f_n}$ 的前 $n$ 项和 $S_n \bmod m$。

输入格式

共一行,包含两个整数 $n$ 和 $m$。

输出格式

输出前 $n$ 项和 $S_n \bmod m$ 的值。

数据范围

$1 \le n \le 2000000000$,
$1 \le m \le 1000000010$

输入样例:
5 1000
输出样例:
12

题解

构造矩阵快速幂,挺烦的,全在草稿纸上了,只能提供代码了.
一维和二维的矩阵快速幂需要掌握

//矩阵快速幂
//求fn的前n项和Sn mod m 
ll n,m;
const int N = 3;
ll a[N][N] = {
   {0,1,0},
   {1,1,1}, 
   {0,0,1} 
};
ll f1[N] = {1,1,1};
ll mul(ll c[N],ll a[N],ll b[N][N]){ //一维 
	ll tmp[N]={0};
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			tmp[i] = (tmp[i] + a[j]*b[j][i]) % m;
		}
	}
	memcpy(c,tmp,sizeof(tmp));
}

ll mul(ll c[N][N],ll a[N][N],ll b[N][N]){  //二维 
	ll tmp[N][N] = {0};
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			for(int k=0;k<N;k++){
				tmp[i][j] = (tmp[i][j] + a[i][k]*b[k][j]) % m;
			}
		}
	}
	memcpy(c,tmp,sizeof(tmp));
	
}

int main(){
	scanf("%lld %lld",&n,&m);  //n的
	n--;
	while(n){
		if(n & 1)mul(f1,f1,a);  //f1 = f1 * a;
		mul(a,a,a);  //a = a * a;
		n >>= 1;
	}
	printf("%lld\n",f1[2]); 	
	return 0;
} 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值