首页 > 其他 > 详细

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

时间:2019-08-10 11:02:09      阅读:92      评论:0      收藏:0      [点我收藏+]

技术分享图片

思路
因为:
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;
}

 

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

原文:https://www.cnblogs.com/mysh/p/11330329.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!