LOJ #10221. 「一本通 6.5 例 3」Fibonacci 前 n 项和

思路
因为:
s[n]=1*s[n-1]+1*f[n]+0*f[n-1]
f[n+1]=0*s[n-1]+1*f[n]+1*f[n-1]
f[n]=0*s[n-1]+1*f[n]+0*f[n-1]
转成矩阵:
?[?]     ? ? ?    ?[? − ?]
?[? + ?] =   ? ? ?      *    ?[?]
?[?]     ? ? ?   ?[? − ?]
所以:
?[?]       ? ? ?   ^  ?−?    ?[?]
?[? + ?]    =     ? ? ?     *      ?[?]
?[?]       ? ? ?          ?[?]

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

long long n,Mod;

struct no {
	long long a[5][5];
} ans,x;

no mul(no &x,no &y) {
	no c;
	memset(&c,0,sizeof(c));
	for(int i=1; i<=3; i++)
		for(int j=1; j<=3; j++)
			for(int k=1; k<=3; k++)
				c.a[i][j]=(c.a[i][j]+x.a[i][k]*y.a[k][j]%Mod);
	return c;
}

void work(long long n) {
	while(n) {
		if(n&1)
			ans=mul(ans,x);
		x=mul(x,x);
		n>>=1;
	}
}

int main () {
	ans.a[1][1]=ans.a[2][2]=ans.a[3][3]=1;
	x.a[1][1]=1;
	x.a[1][2]=1;
	x.a[1][3]=0;
	x.a[2][1]=0;
	x.a[2][2]=1;
	x.a[2][3]=1;
	x.a[3][1]=0;
	x.a[3][2]=1;
	x.a[3][3]=0;
	scanf("%lld%lld",&n,&Mod);
	work(n-1);
	printf("%lld\n",(ans.a[1][1]+ans.a[1][2]+ans.a[1][3])%Mod);
	return 0;
}

 

转载于:https://www.cnblogs.com/mysh/p/11330329.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值